我(可能是错误的)认为is
运算符正在进行id()比较。
>>> x = 10
>>> y = 10
>>> id(x)
1815480092
>>> id(y)
1815480092
>>> x is y
True
然而,对于val is not None
,似乎并非那么简单。
>>> id(not None)
2001680
>>> id(None)
2053536
>>> val = 10
>>> id(val)
1815480092
>>> val is not None
True
然后,'是'运营商做了什么?它只是我推测的对象id比较吗?如果是这样,val is not None
在Python中被解释为not (val is None)
?
答案 0 :(得分:10)
您错过了is not
也是运营商 。
如果没有is
,则常规not
运算符会返回布尔值:
>>> not None
True
因此,{p> not None
是None
的反布尔'值'。在布尔上下文中,None
为false:
>>> bool(None)
False
所以not None
是布尔True
。
None
和True
都是对象,并且都有一个内存地址(Python的CPython实现返回值id()
):
>>> id(True)
4440103488
>>> id(not None)
4440103488
>>> id(None)
4440184448
is
测试两个引用是否指向同一对象;如果某个东西是同一个对象,它也会有相同的id()
。 is
返回布尔值True
或False
。
is not
是is
运算符的反函数。它在一个运算符中相当于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
答案 1 :(得分:3)
作为 Martijn Pieters 答案的补充,None
,True
和False
是单身人士。每个值只有一个实例,因此使用is
来测试它们是安全的。
>>> id(True)
8851952
>>> id(False)
8851920
>>> id(None)
8559264
>>> id(not None)
8851952
>>> id(1 == 0)
8851920
>>> id(1 == 1)
8851952
答案 2 :(得分:0)
Python尝试模拟英语语法,使其更具人性化,但在这种情况下,运算符优先级有点令人困惑。
>>> val is not None
True
在英语中,我们询问val
是否没有由与None
相同的对象表示的值。在上面的示例val=10
中,答案是(正确)True
。
然而,从逻辑的,语法的角度来看,你已逐字逐句地分解了这个陈述,并认为它是:
>>> val is (not None)
False
,如果附在适当的专利中,则会返回您的预期结果(False
)。
正如@Martijn Pieters指出的那样,is not
is an operator in its own right,它是唯一在此工作的运营商。
如果您只想使用不包含空格的运算符将其写为非模糊语句,您可以写:
>>> not (val is None)
True
但这不是你怎么用英语'说'预期的语句,或者甚至可能用伪代码写它。