为什么`True == False是False`评估为False?

时间:2013-06-19 22:06:49

标签: python

对于与==有效但不与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

4 个答案:

答案 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)

来自documentation

  

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。