上一个开发人员在代码中留下了一个非常奇怪的not x is None
yoda条件:
>>> x = None
>>> not x is None
False
>>> x = 1
>>> not x is None
True
经过一些测试,我看起来与x is not None
的输出相同。
>>> x = None
>>> not x is None
False
>>> x is not None
False
>>> x = 1
>>> not x is None
True
>>> x is not None
True
not x is None
是否始终等同于x is not None
?
为了打破这种情况,是not (x is None)
还是(not x) is None
?或者前者总是等同于后者?
答案 0 :(得分:2)
由于is
的优先级高于not
,因此表达式是等效的:
如果x = None
:
x is None
评估为True
,not x is None
评估为False
在x = 1
的情况下:
x is None
评估为False
,not x is None
评估为True
如果x = None
:
x is not None
评估为False
在x = 1
的情况下:
x is not None
评估为True
。
因此,即使动作在语法上不等同,结果也是等效的。
这是not x is None
的AST:
这是x is not None
的AST:
从第二个图中可以看出,内部节点是比较节点,因此在x is None
之前评估not
。
关于表达式的实际评估,似乎python为两者创建了相同的字节码。在这个例子中可以看到:
def foo(x):
x is not None
def bar(x):
not x is None
import dis
dis.dis(foo)
dis.dis(bar)
两者都生成:
0 LOAD_FAST 0 (x)
3 LOAD_CONST 0 (None)
6 COMPARE_OP 9 (is not)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
答案 1 :(得分:0)
is not
是(我相信,唯一的)Python中的双关键字运算符,x is not y
完全等同于not x is y
。 id(x) != id(y)
也会返回相同的结果。最佳读者理解的规范拼写是x is not y
。