110

I get some rather unexpected behavior on an expression that works with == but not with 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

4 回答 4

188

因为实际上这是一个链式比较,所以

True == False is False

相当于

(True == False) and (False is False)

在这种情况下,这可能令人惊讶,但可以让您编写1 <= x < 4不同于其他语言(如 C)的编写方式。

于 2013-06-19T22:11:13.147 回答
37

文档

x < y <= z 等价于 x < y 和 y <= z,除了 y 只计算一次(但在这两种情况下,当 x < y 被发现为假时,z 根本不计算)。

在您的情况下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  
于 2013-06-19T22:11:50.800 回答
9

文档中:

5.9. 比较

与 C 不同,Python 中的所有比较操作都具有相同的优先级,低于任何算术、移位或按位操作。同样与 C 不同的是,像 a < b < c 这样的表达式具有数学中的常规解释:

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
                   | "is" ["not"] | ["not"] "in"
于 2013-06-19T22:11:30.483 回答
4

True == False is False是一个链式比较,这意味着相同(True == False) and (False is False)。由于第一个比较 ( True==False) 为假,因此链式比较的结果为假。

于 2013-06-19T22:11:14.417 回答