Yoda条件为"不是x是None"

时间:2017-04-17 08:48:22

标签: python if-statement equivalent

上一个开发人员在代码中留下了一个非常奇怪的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 ?或者前者总是等同于后者?

2 个答案:

答案 0 :(得分:2)

由于is的优先级高于not,因此表达式是等效的:

如果x = Nonex is None评估为Truenot x is None评估为Falsex = 1的情况下: x is None评估为Falsenot x is None评估为True

如果x = Nonex is not None评估为Falsex = 1的情况下: x is not None评估为True

因此,即使动作在语法上不等同,结果也是等效的。

这是not x is None的AST:

enter image description here

这是x is not None的AST:

enter image description here

从第二个图中可以看出,内部节点是比较节点,因此在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 yid(x) != id(y)也会返回相同的结果。最佳读者理解的规范拼写是x is not y