Python中'in'和比较运算符的优先级
以下的比较会得到 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”)。