我刚刚遇到以下情况,并对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
评估True
和l 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中对它进行了测试,行为是一样的。
答案 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
进行比较。将其保留至while
或if
以测试 。
答案 2 :(得分:-1)
我认为因为你实际上只是在评估range(2)
部分,如果你在翻译中尝试它,你会得到这个。
>>> range(2) == True
>>> False