奇怪的行为:Python 中的“12 in [12,13,14] == True”是什么意思

jos*_*lvo 2 python

我本来希望它在左边或右边有括号。

但它似乎在做别的事情!

>>> 12 in [12,13,14] == True
False
>>> (12 in [12,13,13]) == True
True
>>> 12 in ([12,13,14] == True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument of type 'bool' is not iterable
Run Code Online (Sandbox Code Playgroud)

joa*_*oao 8

以下表达式的计算结果为 False 可能令人惊讶:

12 in [12,13,14] == True
Run Code Online (Sandbox Code Playgroud)

这是发生的事情:inand==运算符具有相同的优先级,并且它们支持从左到右的链接(请参阅文档),因此表达式等效于

12 in [12,13,14] and [12,13,14] == True
Run Code Online (Sandbox Code Playgroud)

Nowand绑定较少,左侧显然评估为 True。现在对于棘手的部分:一个非空序列,如[12,13,14]列表求值True,但它是不等于True。这就是所谓的“真实”值。Truthy 和 Falsy 值不是布尔值(不是 bool 类型的实例),但它们的计算结果为TrueFalse

所以他们在and比较的右侧评估为False