为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

撒科打诨 2021-03-30 13:09:36
今天,CTO在一次采访中问我,看起来像一个简单的问题,该语句返回什么?:None is None is None我以为Python执行了第一个操作None is None并会返回True。之后,它将比较True is None哪个返回False。但是,令我惊讶的是,正确的答案是True。我正在尝试找到该问题的答案,但是经过几天的搜索,我什么都没找到。有人可以解释为什么会这样吗?
查看完整描述

3 回答

?
HUX布斯

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在字节码中重复,如上所示)


查看完整回答
反对 回复 2021-04-09
?
慕的地8271018

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)


查看完整回答
反对 回复 2021-04-09
?
收到一只叮咚

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)


查看完整回答
反对 回复 2021-04-09
  • 3 回答
  • 0 关注
  • 263 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信