为什么([1,0] == True中的1)评估为False?

Pet*_*ood 149 python syntax operator-precedence

当我看到这个问题的答案时,我发现我不明白自己的答案.

我真的不明白这是如何被解析的.为什么第二个示例返回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
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.我想我必须遗漏一些非常明显的东西.


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

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

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

看着0 < 0 == 0你可以想象每一半被评估并作为表达有意义:

>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True
Run Code Online (Sandbox Code Playgroud)

所以该链接回答了为什么评估False:

>>> 0 < 0 == 0
False
Run Code Online (Sandbox Code Playgroud)

但是我的例子1 in ([1,0] == True)作为一个表达没有意义,所以不是有两个(当然是错误的)可能的解释,只有一个似乎是可能的:

>>> (1 in [1,0]) == True
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 190

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

(1 in [1, 0]) and ([1, 0] == True)
Run Code Online (Sandbox Code Playgroud)

这显然是False.

这也适用于像这样的表达式

a < b < c
Run Code Online (Sandbox Code Playgroud)

转化为

(a < b) and (b < c)
Run Code Online (Sandbox Code Playgroud)

(没有评估b两次).

有关更多详细信息,请参阅Python语言文档.

  • 另外的证明,`1 in [1,0] == [1,0]`评估为'True`. (38认同)
  • 我一直认为这是一种语言疣.我希望`in`运算符比其他比较运算符具有更高的优先级,并且它不链.但也许我错过了一个用例. (9认同)
  • @Sven有用:也许吧.可读:绝对不是.Python声称使用这种约定来模拟常见的数学排版,但是当与`in`一起使用时,这已经不再是这种情况,并且使其非常直观. (7认同)
  • @KonradRudolph:我在数学文本中看到过不止一次的"1≤x∈ℝ",但我基本上同意你的看法. (6认同)
  • 很好的捕获,我甚至没有想到这一点.在所有`x <y <z`有意义之后允许链接'in`没有多大意义,但在z中的y中没有那么多` (3认同)
  • @pkoch:我比较熟悉Python语言并且知道比较运算符链.这不是一个秘密 - 即使是[教程解释](http://docs.python.org/tutorial/datastructures.html#more-on-conditions).我所要做的就是仔细检查它是否也适用于`in`操作符,但这个问题实际上是清楚的.另请参阅我的帖子中的链接. (2认同)
  • @SvenMarnach我知道链接,它不是那么明显.`in`没有精神匹配作为比较运算符.然而,为了寻找你神奇的蟒蛇方式,我遇到了模块.它确实有所启发.试试`ast.dump(ast.parse('0 in [0,1] == True').body [0])`和`ast.dump(ast.parse('(1 in [0,1]) ==真').body [0])`. (2认同)