对于与==
有效但不与is
有效的表达式,我遇到了一些意外的行为:
>>> (True == False) is False
True
>>> True == (False is False)
True
>>> True == False is False
False
>>> id(True)
8978640
>>> id(False)
8978192
>>> id(True == False)
8978192
>>> id(False is False)
8978640
答案 0 :(得分:40)
因为实际上是chained comparison,所以
True == False is False
相当于
(True == False) and (False is False)
在这种情况下,这可能会令人惊讶,但与其他语言(例如C)不同,您可以编写1 <= x < 4
。
答案 1 :(得分:12)
来自docs:
x&lt; y&lt; = z等于x&lt; y和y&lt; = z,除了y是 仅评估一次(但在两种情况下,z都不进行评估 x&lt; y被发现是假的。)
在您的情况下,True == False is False
相当于True == False and False is False
,因为第一个条件为False
,因此它会短路并返回False
。
>>> dis.dis(lambda : True == False is False)
1 0 LOAD_GLOBAL 0 (True)
3 LOAD_GLOBAL 1 (False)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 2 (==)
11 JUMP_IF_FALSE_OR_POP 21 <---------this step
14 LOAD_GLOBAL 1 (False)
17 COMPARE_OP 8 (is)
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
答案 2 :(得分:4)
5.9。比较
与C不同,Python中的所有比较操作都具有相同的优先级,低于任何算术,移位或按位操作的优先级。与C不同,表达式如同&lt; b&lt; c具有数学常规的解释:
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
| "is" ["not"] | ["not"] "in"
答案 3 :(得分:3)
True == False is False
是一个链式比较,与(True == False) and (False is False)
相同。由于第一次比较(True==False
)为false,因此链式比较的结果为False。