在Python 3中,range(...)中的x == y是什么意思?

9

我刚刚在 Python 3 中发现了以下代码行。

1 in range(2) == True

我原以为这个表达式会是True,因为1在range(2)中是True,而True等于True也是True。但实际输出的是False。因此它的意思和(1 in range(2)) == True并不相同。此外,它的意思也和1 in (range(2) == True)不相同,后者会引发错误。
尽管我有多年的Python经验,但仍然感到困惑。到底发生了什么?

1
@chrisz,这里使用了 in,如果是这种情况,那么它将会是一个语法错误(argument of type 'bool' is not iterable)。 - Holloway
哎呀,你是对的,我看错了。 - user3483203
1
今天在SO上有一个之前已被删除的问题。顺便说一下,他们的代码是错误的,但在我指出之前他们就已经删掉了这个问题。 - Olivier Melançon
4
该表达式相当于(1 in range(2)) and (range(2) == True),其中第二部分为假,因此整个条件为假。 - poke
1
@Olivier 是的, in 是一个比较操作符有点反直觉。但我不得不查看实际文档以确认这一怀疑。 - juanpa.arrivillaga
显示剩余4条评论
1个回答

14

这是由于两个运算符都是比较运算符,因此被解释为运算符链接:

https://docs.python.org/3.6/reference/expressions.html#comparisons

比较可以任意链接,例如,x < y <= z 相当于 x < y and y <= z,只是 y 只被评估一次(但在两种情况下,当找到 x < y 为 false 时,z 都不会被评估)。

所以等同于:

>>> (1 in range(2)) and (range(2) == True)
False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接