【问题标题】:Why is `True is False == False`, False in Python? [duplicate]为什么`True is False == False`,在 Python 中为 False? [复制]
【发布时间】:2015-09-30 00:13:16
【问题描述】:

为什么使用括号时这些语句按预期工作:

>>> (True is False) == False
True

>>> True is (False == False)
True

但是在没有括号的时候返回False

>>> True is False == False
False

【问题讨论】:

  • 显然你进入了 Python 语法的少数黑暗角落之一(即结果令人惊讶的地方)。

标签: python python-3.x


【解决方案1】:

【讨论】:

  • 所以简而言之,这是一个错误?这似乎非常违反直觉。
  • 另一方面,您可以写0 < 0.25 < 0.5,这会在其他语言中产生奇怪的结果。
  • 不,这不是错误 - 这是语言的预期操作让您感到惊讶
【解决方案2】:

在比较运算符方面,Python 具有独特的传递性。在更简单的情况下会更容易看到。

if 1 < x < 2:
    # Do something

这就是它看起来的样子。它检查 1

>>> True is False == False
False

它正在检查True是否为False False == False,只有其中一个为真。

【讨论】:

  • 啊!我用过1 &lt; x &lt; 2,只是觉得是个特例,没想到也适用于其他运营商。
【解决方案3】:

基于pythondocumentation关于运算符优先级:

请注意,比较、成员资格测试和身份测试都具有相同的优先级,并且具有从左到右的链接功能,如“比较”部分所述。

所以实际上你有一个像下面这样的链式声明:

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

您可以假设中心对象将在 2 个操作和其他对象之间共享(在这种情况下为 False)。

请注意,所有比较也是如此,包括跟随操作数的成员资格测试和身份测试操作:

in, not in, is, is not, <, <=, >, >=, !=, ==

例子:

>>> 1 in [1,2] == True
False

【讨论】:

    【解决方案4】:

    如果在计算表达式时遇到相同优先级的运算符,Python 会执行链接。

    比较,包括测试,它们都具有相同的优先级 从左到右

    下面提到的运算符具有相同的优先级。

    in, not in, is, is not, <, <=, >, >=, <>, !=, ==
    

    因此,当 Python 尝试计算表达式 True is False == False 时,会遇到优先级相同的运算符 is==,因此它执行从左到右的链接。

    所以,True is False == False 表达式实际上被计算为:

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

    False 作为输出。

    【讨论】:

      【解决方案5】:

      Python 以您在数学中所期望的方式解释多个(不)等式:

      在数学中a = b = c 表示所有a = bb = ca = c

      所以True is False == False 表示True == FalseFalse == FalseTrue == False,即False

      对于布尔常量,is 等价于 ==

      【讨论】:

      • 其实a is b == c只表示(a is b) and (b == c)ac没有比较。考虑0.0 == 0 is 0
      • @Mauris 我的意思是 a 是 b,b 是 c 意味着 a 是 c。我只是给出了一种简单的方法来确定结果而不是如何处理
      猜你喜欢
      • 1970-01-01
      • 2015-03-22
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 2021-11-10
      • 2015-03-15
      • 2022-01-02
      相关资源
      最近更新 更多