为什么`None is None is None`返回True?

2024-05-29 03:00:58 发布

您现在位置:Python中文网/ 问答频道 /正文

今天,在一次采访中,首席技术官问我一个简单的问题

这个语句返回什么?公司名称:

None is None is None

我以为Python执行了第一个操作None is None,并将返回True。之后,它将比较True is None,后者将返回False。但是,令我惊讶的是,正确的答案是True。我正试图找到这个问题的答案,但经过几天的搜索,我什么也没找到。有人能解释一下为什么会这样吗?在


Tags: 答案名称nonefalsetrueis公司语句
3条回答

is是比较运算符,as seen in the docs

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"

因此,就像其他比较运算符一样,它可以任意链接。所以

a = b = c = None
a is b is c

相当于

^{pr2}$

字节码显示在这里执行两个比较,中间部分被复制:

>>> import dis
>>> def a():
...     return None is None is None
... 
>>> dis.dis(a)
  2           0 LOAD_CONST               0 (None)
              3 LOAD_CONST               0 (None)
              6 DUP_TOP
              7 ROT_THREE
              8 COMPARE_OP               8 (is)
             11 JUMP_IF_FALSE_OR_POP    21
             14 LOAD_CONST               0 (None)
             17 COMPARE_OP               8 (is)
             20 RETURN_VALUE
        >>   21 ROT_TWO
             22 POP_TOP
             23 RETURN_VALUE

docs for comparisons中所述,这是因为这些运算符链在一起。在

a op b op c将被转换为a op b and b op c(注意b在字节码中是重复的,如上所示)

正如一些人所说,Python比较可以链接到。在

为了解释,当链接时,Python实际上表达式。在

这背后的基本原理是,像a < b < c这样的表达式具有数学上的常规解释。因此,您的特定表达式None is None is None中涉及到identity运算符,因此会造成混乱。在

所以基本上,这将转化为:

(None is None) and (None is None)

显然是True

下面是Python中的另一个示例docs

更多信息

尤其是因为这是一个面试问题,所以需要注意的是,这并不是所有语言都有的普遍行为。在

正如我链接的文件中所说

Unlike C, all comparison operations in Python have the same priority, which is lower than that of any arithmetic, shifting or bitwise operation.

所以,让我们考虑一下10 > x > 2表达式(因为is运算符在C中无效)。在

C的翻译(因为operator precedence

^{pr2}$

Python的翻译

(10 > x) and (x > 2)

相关问题 更多 >

    热门问题