运算符优先级的 Python 文档指出:
同一框中的运算符从左到右分组(比较除外,包括测试,它们都具有相同的优先级和从左到右的链 - 请参阅比较...部分)
这是什么意思?具体来说:
“同一框中的运算符从左到右分组(比较除外......)” - 比较不是从左到右分组吗?
如果比较没有从左到右分组,他们会做什么呢?他们是“连锁”而不是“群体”吗?
如果比较“链”而不是“组”,“链”和“分组”有什么区别?
有什么例子可以证明比较运算符从左到右而不是从右到左链接?
分组(这是非比较运算符所做的):
a + b + c means (a + b) + c
链接(这是比较运算符所做的):
a < b < c means (a < b) and (b < c)
从左到右分组(这是分组的方式):
5 - 2 - 1 means (5 - 2) - 1 == 2
而不是从右到左分组(这会产生不同的结果):
5 - (2 - 1) == 4
从左到右链接
链接是从左到右的,因此在 中a < b < c
,表达式a < b
在 之前计算b < c
,如果a < b
为假,b < c
则不计算。
(2 < 1 < f())
False
在不调用函数的情况下给出值f
,因为2 < 1
计算结果为 false,所以不需要执行第二次比较。
f() > 1 > g()
调用f()
以评估第一个比较,并且根据结果,它可能需要也可能不需要评估第二个条件,这需要调用g()
.
注意。每个操作数最多评估一次。所以在表达式1 < f() < 2
中,该函数f()
只被调用一次,并且它给出的值被用于两次比较(如果需要)。
事实上,连锁行为并不是那么明显。
a == b == c
尽管人们希望这会转换为
a == b and b == c
它实际上被转换成类似于
b == c if a == b else False
如果试图覆盖比较运算符的行为并将它们链接起来,这有点令人困惑。