为什么(1 in [1,0] == True)的结果是False?

157

当我查看这个问题的答案时,我发现我自己的答案不理解。

我并不真正理解这是如何被解析的。为什么第二个例子返回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

感谢任何帮助。我认为我一定错过了什么非常明显的东西。


我认为这与链接的重复不同:

为什么在Python中表达式0 < 0 == 0返回False?.

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

观察0 < 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

1
运算符优先级... == 的绑定比 in 更紧密,因此 [1,0] == True 首先被评估,然后将该结果馈送到 1 in other_result - Marc B
我已经删除了 Python-2.7 标签,因为 Python 3.2 的行为方式相同。 - lvc
1
@Marc B:没有解释第二个表达式。 - Scott Hunter
35
@MarcB,这个问题包含了一个使用括号来证明那种解释错误的测试。 - Mark Ransom
1个回答

202

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

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

很明显是False

这也会发生在类似表达式的情况下。

a < b < c

翻译成

(a < b) and (b < c)

(不重复评估b)。

请参阅Python语言文档以获取更多详细信息。


40
进一步证明,1 in [1, 0] == [1, 0] 的结果为 True - Andrew Clark
10
我一直认为这是语言的一个缺陷。我更喜欢in运算符的优先级高于其他比较运算符,且不链接。但也许我错过了某些用例。 - Steven Rumbalski
4
很好的发现,我甚至没有想到。允许链式使用in没有太多意义-毕竟x<y<z有意义,但x in y in z就不是那么有意义了。 - BlueRaja - Danny Pflughoeft
7
有用:可能。易读:绝对不是。Python 声称通过这种约定模拟常见的数学排版,但在与 in 结合使用时,这种约定就不再适用了,使得它相当令人费解。 - Konrad Rudolph
7
@KonradRudolph:我在数学文本中看到过像“1 ≤ x ∈ ℝ”这样的东西不止一次,但基本上我同意你的观点。 - Sven Marnach
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接