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)
mir*_*ulo 10
is是一个比较运算符,如文档中所示:
Run Code Online (Sandbox Code Playgroud)comparison ::= or_expr ( comp_operator or_expr )* comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!=" | "is" ["not"] | ["not"] "in"
所以就像其他比较运算符一样,它可以任意链接.所以
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 次 |
| 最近记录: |