我在使用==
时得到了一些意外的结果,但是在使用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
我在使用==
时得到了一些意外的结果,但是在使用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
实际上这是一个链式比较,因此
True == False is False
等价于
(True == False) and (False is False)
在这种情况下可能会令人惊讶,但是您可以编写 1 <= x < 4
这样的代码,这与其他语言(如C)不同。
"<" | ">" | "==" | ">=" | "<=" | "<>" | "!=" | "is" ["not"] | ["not"] "in"
,它们的优先级都比and
低。(顺便说一句,感谢您对语法的修正,这真的帮助了我们非母语人士)。 - jorgeca从文档中得知:
x < y <= z 等价于 x < y and y <= z,但是当 x < y 为假时,在两种情况下都不会评估 z,只评估一次 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
来自文档:
5.9. 比较
与C语言不同,在Python中所有比较操作的优先级相同,低于任何算术、移位或按位操作。而且与C语言不同的是,类似于 a < b < c 的表达式在数学上的解释是惯例:
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
| "is" ["not"] | ["not"] "in"
True == False is False
是一种链式比较,意思与 (True == False) and (False is False)
相同。由于第一个比较 (True==False
) 是 false,所以链式比较的结果是 False。
is
和==
无关,因为在任何情况下该表达式的值都为False
。感谢各位的快速回答! - rayluTrue is False
的结果是False,True == False
也是False,那么为什么True == False is False
的结果却应该是True呢? - jpic