Python比较运算符从左到右链式/成组意味着什么



运算符优先级状态的Python文档:

同一个框组中的运算符从左到右(除了比较,包括具有相同优先级的测试链从左到右--请参阅"比较…"一节)

这是什么意思?具体而言:

  1. "从左到右同一框组中的运算符(除比较…)"--比较而不是从左到右分组?

  2. 如果比较不是从左到右分组,那么它们会做什么?他们是"连锁"还是"集团"?

  3. 如果比较"连锁"而不是"分组","连锁"one_answers"分组"之间有什么区别?

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

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

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 < bb < c之前求值,如果a < b为假,则不求值b < c

(2 < 1 < f())在不调用函数f的情况下给出值False,因为2 < 1的计算结果为false,所以不需要执行第二次比较。

f() > 1 > g()调用f()来评估第一个比较,根据结果,它可能需要也可能不需要评估第二个条件,这需要调用g()

注:。每个操作数最多求值一次。因此,在表达式1 < f() < 2中,函数f()只被调用一次,并且它给出的值在两次比较中都被使用(如果必要的话)。

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

实际上,链的行为并不那么明显。

a == b == c

尽管人们期望将其转换为

a == b and b == c

事实上,它被转换成类似的东西

b == c if a == b else False

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

最新更新