【问题标题】:Why does `True == False is False` evaluate to False? [duplicate]为什么 `True == False is False` 评估为 False? [复制]
【发布时间】:2013-06-19 22:06:48
【问题描述】:

我在一个适用于== 但不适用于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== 无关,因为无论哪种情况,表达式的计算结果都是False。感谢所有快速回答!
  • @MartijnPieters 在输入我的答案时,我认为之前一定有人问过这个问题,但我想这可能很难用谷歌搜索。这个question 可能是另一个副本。
  • 我认为对于那些对“从 1 到 10 分,你的 Python 技能如何”的问题回答“10”的人来说,这将是一个很好的面试问题?
  • @jpic:我相信这个问题的精神是很多人会写 True == False is False 认为它会被解析为 (True == False) is False,它评估to FALSE 是 False,因此应该是 True。

标签: python


【解决方案1】:

因为事实上那是chained comparison,所以

True == False is False

等价于

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

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

【讨论】:

  • (括号是never,顺便说一下)
  • 显然只有当它们具有相同的优先级时
  • @NullUserException 嗯,我认为不需要它们,因为可能的运算符是"<" | ">" | "==" | ">=" | "<=" | "<>" | "!=" | "is" ["not"] | ["not"] "in",它们的优先级都低于and。 (顺便说一句,感谢语法修复,这对我们非母语人士很有帮助)。
  • 这正是我倾向于将复合逻辑比较包装在括号中的原因,我根本不记得我使用的所有语言的语法,而且不值得冒险离开它们并拥有意外行为。
  • @zzzzBov 我完全同意,这就是我确实包装它们的原因;)
【解决方案2】:

来自docs

x

在您的情况下,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  

【讨论】:

  • 感谢 dis.dis()。我学到了一些有用的东西。:)
  • 我没有投反对票,但在我看来,语言规则的描述足以理解发生了什么。反汇编似乎并没有增加太多(除了关注特定于实现的细节)。
【解决方案3】:

来自documentation

5.9。比较

与 C 不同,Python 中的所有比较操作都具有相同的优先级,低于任何算术、移位或按位操作。同样与 C 不同的是,像 a

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
                   | "is" ["not"] | ["not"] "in"

【讨论】:

    【解决方案4】:

    True == False is False 是链式比较,与(True == False) and (False is False) 含义相同。由于第一次比较(True==False)为假,链式比较的结果为假。

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 2015-03-15
      • 2019-04-24
      • 2015-09-30
      • 1970-01-01
      • 2022-01-10
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多