【问题标题】:Why does (1 in [1,0] == True) evaluate to False?为什么 (1 in [1,0] == True) 评估为 False?
【发布时间】:2012-03-06 06:16:33
【问题描述】:

当我查看this question 的答案时,我发现我自己的答案并不理解。

我真的不明白这是如何解析的。为什么第二个例子返回 False?

>>> 1 in [1,0]             # This is expected
True
>>> 1 in [1,0] == True     # This is strange
False
>>> (1 in [1,0]) == True   # This is what I wanted it to be
True
>>> 1 in ([1,0] == True)   # But it's not just a precedence issue!
                           # It did not raise an exception on the second example.

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable

感谢您的帮助。我想我一定遗漏了一些非常明显的东西。


我认为这与链接的副本略有不同:

Why does the expression 0 < 0 == 0 return False in Python?.

这两个问题都与人类对表达的理解有关。似乎有两种评估表达式的方法(在我看来)。当然,两者都不正确,但在我的例子中,最后一种解释是不可能的。

看着0 &lt; 0 == 0,您可以想象每一半都被评估并作为表达式有意义:

>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True

所以链接回答了为什么这会评估False

>>> 0 < 0 == 0
False

但是对于我的示例 1 in ([1,0] == True) 作为表达式来说没有意义,因此没有两种(公认是错误的)可能的解释,似乎只有一种可能:

>>> (1 in [1,0]) == True

【问题讨论】:

  • 运算符优先级...==in 绑定得更紧密,所以首先评估[1,0] == True,然后将结果提供给1 in other_result
  • 我删除了 Python-2.7 标签,因为 Python 3.2 的行为方式相同。
  • @Marc B:不解释第二个表达式
  • @MarcB,这个问题包括一个使用括号来反驳这种解释的测试。

标签: python syntax operator-precedence


【解决方案1】:

Python 实际上在这里应用了比较运算符链接。表达式被翻译成

(1 in [1, 0]) and ([1, 0] == True)

显然是False

这也发生在像

这样的表达式中
a < b < c

翻译成

(a < b) and (b < c)

(不计算 b 两次)。

有关详细信息,请参阅Python language documentation

【讨论】:

  • 对此的额外证明,1 in [1, 0] == [1, 0] 的计算结果为 True
  • 我一直认为这是一个语言疣。我更希望in 运算符具有比其他比较运算符更高的优先级并且它不链接。但也许我错过了一个用例。
  • 不错的收获,我什至没有想到这一点。允许in 的链接没有多大意义 - 毕竟x &lt; y &lt; z 是有道理的,但对于x in y in z 则没有那么多
  • @Sven 有用:也许。可读性:绝对不是。 Python 声称使用此约定来模拟常见的数学排版,但当与 in 一起使用时,情况就完全不同了,而且非常违反直觉。
  • @KonradRudolph:我不止一次在数学课本中看到过类似“1 ≤ x ∈ ℝ”的想法,但我基本上同意你的看法。
猜你喜欢
  • 1970-01-01
  • 2015-03-15
  • 2012-01-24
  • 2015-03-22
  • 1970-01-01
  • 2014-02-16
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多