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

今天,CTO在一次采访中问我,看起来像一个简单的问题,

该语句返回什么?:

None is None is None

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


撒科打诨
浏览 264回答 3
3回答

HUX布斯

字节码显示此处正在执行两个比较,中间是重复的:>>> 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如文档中所述,为了进行比较,这是因为这些运算符链接在一起。a op b op c将被翻译为a op b and b op c(注释b在字节码中重复,如上所示)

慕的地8271018

正如某些人所评论的那样,Python比较可以被链接起来。为了便于说明,链接的时候,Python的实际与运算表达式。这样做的理由是,像a < b < c这样的表达式具有数学上的常规解释。因此,您的特定表达的混乱None is None is None,其中identy运营商都参与其中。因此,基本上,这将转换为:(None is None) and (None is None)这显然是 True这是Python文档中的另一个示例更多的信息特别是由于这是一个面试问题,因此需要特别注意的是,这并不是所有语言之间都普遍存在的行为。正如我链接的文档中所述,与C不同,Python中的所有比较运算都具有相同的优先级,该优先级低于任何算术,移位或按位运算。因此,让我们考虑一下10 > x > 2表达式(因为is运算符在C中无效)。C的翻译(由于运算符优先级)((10 > x) > 2)Python的翻译(10 > x) and (x > 2)

收到一只叮咚

is是一个比较运算符,如docs所示:comparison&nbsp; &nbsp; ::=&nbsp; or_expr ( comp_operator or_expr )*comp_operator ::=&nbsp; "<" | ">" | "==" | ">=" | "<=" | "!="&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| "is" ["not"] | ["not"] "in"因此,就像其他比较运算符一样,它可以任意链接。所以a = b = c = Nonea is b is c相当于(a is b) and (b is c)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python