测试布尔等价性时的评估顺序

时间:2013-10-22 17:47:26

标签: python boolean operator-precedence

我刚刚遇到以下情况,并对Python的行为感到好奇:

>>> x = 1
>>> x in range(2)
True
>>> type(x in range(2))
<type 'bool'>
>>> x in range(2) == True
False
>>> x in range(2) == False
False
>>> (x in range(2)) == True
True

特别是,为什么(1 in range(2)) == True评估Truel in range(2) == True评估为False?似乎后者的评估行为有一些奇怪的顺序,除非你明确错误地命令,你得到一个TypeError

>>> x in (range(2) == True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument of type 'bool' is not iterable

为了记录,我不知道我会使用x in range(2) == True而不仅仅是x in range (2)的任何情况,但我想知道为什么会发生这种情况。我也在Python2.7和Python3中对它进行了测试,行为是一样的。

3 个答案:

答案 0 :(得分:4)

以下表达式:

x in range(2) == True

是链式比较,评估为:

x in range(2) and range(2) == True

False range(2) == True作为False评估为x < y <= z。请参阅Comparison的文档:

  

比较可以任意链接,例如,x < y and y <= z等同于x < y,除了y仅被评估一次(但在两种情况下,当{{1}}是y时,根本不评估z发现是假的。)

答案 1 :(得分:3)

==平等和in会员运营商都是comparison operators,这些可以链接

链接采用expr1 op1 expr2 op2 expr3的形式,其解释为(expr1 op1 expr2) and (expr2 op2 expr3),但中间expr2仅评估一次。

所以,你的例子真的是:

x in range(2) and range(2) == True

range(2)永远不会等于布尔值。

请注意,您绝不应该与== True== False进行比较。将其保留至whileif以测试

答案 2 :(得分:-1)

我认为因为你实际上只是在评估range(2)部分,如果你在翻译中尝试它,你会得到这个。

>>> range(2) == True
>>> False