19

运算符优先级的 Python 文档指出:

同一框中的运算符从左到右分组(比较除外,包括测试,它们都具有相同的优先级和从左到右的链 - 请参阅比较...部分)

这是什么意思?具体来说:

  1. “同一框中的运算符从左到右分组(比较除外......)” - 比较不是从左到右分组吗?

  2. 如果比较没有从左到右分组,他们会做什么呢?他们是“连锁”而不是“群体”吗?

  3. 如果比较“链”而不是“组”,“链”和“分组”有什么区别?

  4. 有什么例子可以证明比较运算符从左到右而不是从右到左链接?

4

2 回答 2

39

分组(这是非比较运算符所做的):

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()只被调用一次,并且它给出的值被用于两次比较(如果需要)。

https://en.wikipedia.org/wiki/Short-circuit_evaluation

于 2014-09-09T21:02:23.883 回答
1

事实上,连锁行为并不是那么明显。

a == b == c

尽管人们希望这会转换为

a == b and b == c

它实际上被转换成类似于

b == c if a == b else False

如果试图覆盖比较运算符的行为并将它们链接起来,这有点令人困惑。

于 2020-07-23T03:02:25.820 回答