Python中'in'和比较运算符的优先级

18 投票
3 回答
2448 浏览
提问于 2025-04-17 02:39

以下的比较会得到 True

>>> '1' in '11'
True
>>> ('1' in '11') == True
True

但是如果把括号换个位置,我就会遇到一个类型错误(TypeError):

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

那么我该怎么做才能在没有括号的情况下得到 False 呢?

>>> '1' in '11' == True
False

3 个回答

2

在编程中,有一种叫做“链式比较”的写法,这让我们可以像写 x < y < z 这样简单,而它的意思其实是 x < y and y < z,也就是同时满足这两个条件。来看这个例子:

>>> (False == True) == False
True
>>> False == (True == False)
True
>>> False == True == False
False
>>>

所以在你的例子中,'1' in '11' == True 实际上等同于 ('1' in '11') and ('11' == True)

9

这和优先级没有关系。在Python中,关系运算符是可以连着用的,而包含运算符也被认为是关系运算符。所以:

'1' in '11' == True

其实和下面这段代码是一样的:

('1' in '11') and ('11' == True)

这段代码是假的,因为 True 并不等于 "11"。

24

Python手册上说,in==的优先级是一样的。也就是说,它们默认是从左到右进行计算的,但还有一个叫做“链式操作”的东西需要考虑。你上面写的这个表达式('1' in '11' == True)实际上是这样被计算的...

('1' in '11') and ('11' == True)

结果当然是False。如果你不知道什么是链式操作,它就是让你可以像这样...

if 0 < a < 1:

在Python中使用,并且让它的意思和你预期的一样(“a大于0但小于1”)。

撰写回答