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

Vla*_*lav 56 python python-2.7 python-3.x

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

这句话的回报是什么?:

None is None is None
Run Code Online (Sandbox Code Playgroud)

我认为Python执行了第一个操作None is None并将返回True.之后,它将比较True is None哪些将返回False.但令我惊讶的是,正确的答案是True.我试图找到这个问题的答案,但经过几天的搜索我没有发现任何东西.有人可以解释为什么会这样吗?

shu*_*e87 40

字节码显示正在执行两个比较,中间是重复的:

>>> 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
Run Code Online (Sandbox Code Playgroud)

正如比较文档中所述,这是因为这些运营商联系在一起.

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


sch*_*tte 32

有些人评论说,可以链接Python比较.

为了便于解释,在链接时,Python实际上是AND表达式.

Ť 他这背后的理由,就是喜欢表现a < b < c有是数学传统的解释.因此,None is None is None在涉及identy运算符时,您的特定表达式会混淆.

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

(None is None) and (None is None)
Run Code Online (Sandbox Code Playgroud)

这很清楚 True

这是Python 文档中的另一个示例

更多的信息

特别是因为这是一个面试问题,重要的是要注意这不是所有语言共有的一般行为.

正如我在链接的文档中所述,

与C不同,Python中的所有比较操作都具有相同的优先级,低于任何算术,移位或按位操作的优先级.

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

C的翻译(由于运营商优先)

((10 > x) > 2)
Run Code Online (Sandbox Code Playgroud)

Python的翻译

(10 > x) and (x > 2)
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案,因为它解释了行为背后的基本原理:***像<b <c这样的表达式具有数学常规的解释***.在我看来,看看它是如何在字节码中实现的,并没有解释任何可以让我能够推断到其他情况的东西. (5认同)

mir*_*ulo 10

is是一个比较运算符,如文档中所示:

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"
Run Code Online (Sandbox Code Playgroud)

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

a = b = c = None
a is b is c
Run Code Online (Sandbox Code Playgroud)

相当于

(a is b) and (b is c)
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

2115 次

最近记录:

7 年,2 月 前