5

我刚刚遇到以下情况,并对 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来代替 just x in range (2),但只是想知道为什么会这样。我也在 Python2.7 和 Python3 中测试过这个,行为是一样的。

4

3 回答 3

4

下面的表达式:

x in range(2) == True

是链式比较,并被评估为:

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

这会给你评估False为. 请参阅比较文档:range(2) == TrueFalse

比较可以任意链接,例如,x < y <= z等价于x < y and y <= z,除了 y 只计算一次(但在两种情况下,当x < y发现 z 为假时,根本不计算 z)。

于 2013-10-22T17:56:26.737 回答
3

==相等和in成员运算符都是比较运算符,它们可以链接起来

链接采用 的形式expr1 op1 expr2 op2 expr3,它被解释为(expr1 op1 expr2) and (expr2 op2 expr3)但中间expr2只计算一次。

所以,你的例子真的是:

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

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

请注意,您真的不应该与== Trueor比较== False。把它留给你whileif你测试。

于 2013-10-22T18:00:06.397 回答
-1

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

>>> range(2) == True
>>> False
于 2013-10-22T18:18:01.607 回答