"是"运算符在Python中做了什么?

pro*_*eek 7 python operators

我(可能是错误的)认为is运算符正在进行id()比较.

>>> x = 10
>>> y = 10
>>> id(x)
1815480092
>>> id(y)
1815480092
>>> x is y
True
Run Code Online (Sandbox Code Playgroud)

然而,val is not None看起来它并不那么简单.

>>> id(not None)
2001680
>>> id(None)
2053536
>>> val = 10
>>> id(val)
1815480092
>>> val is not None
True
Run Code Online (Sandbox Code Playgroud)

然后,'是'运营商做了什么?它只是我推测的对象id比较吗?如果是这样,val is not None在Python中被解释为not (val is None)

Mar*_*ers 10

你错过了这is not是一个操作符.

没有is,常规not运算符返回一个布尔值:

>>> not None
True
Run Code Online (Sandbox Code Playgroud)

not None因此是反布尔'值' None.在布尔上下文中None是false:

>>> bool(None)
False
Run Code Online (Sandbox Code Playgroud)

所以not None是布尔True.

两者NoneTrue有对象了,而且都有一个内存地址(该值id()返回CPython的Python实现):

>>> id(True)
4440103488
>>> id(not None)
4440103488
>>> id(None)
4440184448
Run Code Online (Sandbox Code Playgroud)

is测试两个引用是否指向同一个对象 ; 如果某个东西是同一个对象,它也会有相同的东西id().is返回一个布尔值,TrueFalse.

is notis运算符的反转.它相当于not (op1 is op2)一个运营商.它应该在op1 is (not op2)这里阅读:

>>> 1 is not None     # is 1 a different object from None?
True
>>> 1 is (not None)   # is 1 the same object as True?
False
Run Code Online (Sandbox Code Playgroud)