3 回答
TA贡献1876条经验 获得超6个赞
字节码显示此处正在执行两个比较,中间是重复的:
>>> 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在字节码中重复,如上所示)
TA贡献1796条经验 获得超4个赞
正如某些人所评论的那样,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)
TA贡献1821条经验 获得超4个赞
is是一个比较运算符,如docs所示:
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="
| "is" ["not"] | ["not"] "in"
因此,就像其他比较运算符一样,它可以任意链接。所以
a = b = c = None
a is b is c
相当于
(a is b) and (b is c)
添加回答
举报