【发布时间】:2013-11-14 21:31:23
【问题描述】:
Python如何解释“'abc'中的'a'为真”?我试图评估以下两个表达式:
>>> 'a' in 'abc' is True:
False
>>> ('a' in 'abc') is True:
True
(我知道“is”关键字通常不应该用来与True进行比较,这只是一个例子)
【问题讨论】:
-
您正在链接操作员。
标签: python
Python如何解释“'abc'中的'a'为真”?我试图评估以下两个表达式:
>>> 'a' in 'abc' is True:
False
>>> ('a' in 'abc') is True:
True
(我知道“is”关键字通常不应该用来与True进行比较,这只是一个例子)
【问题讨论】:
标签: python
有趣的问题!
这是来自'a' in 'abc' is True的字节码:
>>> import dis
>>> dis.disassemble((lambda: 'a' in 'abc' is True).func_code)
2 0 LOAD_CONST 1 ('a') # stack: 'a'
3 LOAD_CONST 2 ('abc') # stack: 'a' 'abc'
6 DUP_TOP # stack: 'a' 'abc' 'abc'
7 ROT_THREE # stack: 'abc' 'a' 'abc'
8 COMPARE_OP 6 (in) # stack: 'abc' True
11 JUMP_IF_FALSE_OR_POP 21 # stack: 'abc'
14 LOAD_GLOBAL 0 (True) # stack: 'abc' True
17 COMPARE_OP 8 (is) # stack: False
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
并与('a' in 'abc') is True的比较:
>>> import dis
>>> dis.disassemble((lambda: ('a' in 'abc') is True).func_code)
1 0 LOAD_CONST 1 ('a') # stack: 'a'
3 LOAD_CONST 2 ('abc') # stack: 'a' 'abc'
6 COMPARE_OP 6 (in) # stack: True
9 LOAD_GLOBAL 0 (True)
12 COMPARE_OP 8 (is)
15 RETURN_VALUE
所以看起来表达式 'a' in 'abc' is True 的计算结果大致如下:
>>> 'a' in 'abc' and 'abc' is True
这似乎是运算符链接的结果:https://stackoverflow.com/a/19751586/71522 — 与使 1 < 5 < 10 正常工作的魔法相同。
非常有趣!
(注意:这是使用 CPython 2.7.2 完成的)
【讨论】:
'a' in 'abc' is True 到 'abc' in 'a' and 'abc' is True,使用 and,而不是 or。只有当两个比较都为真时,整个表达式才为真。