关于 Python 中的左侧装订

Regarding left-sided Binding in Python

我是 Python 的新手,我还在学习中。我在使用运算符时了解了左侧绑定的概念(并且被教导只有取幂使用 RIGHT-SIDED BINDING)。我还了解到,*/ 具有相同的优先级,运算符的绑定决定了一些具有相同优先级的运算符执行的计算顺序,并排放在一个表达式中。

但是现在在教授复合赋值运算符时,他们使用了下面的例子

a = 6
b = 3
a /= 2 * b
print(a)

给出的答案是1.0

他们给出的解释如下。

2 * b = 6

a = 6 → 6 / 6 = 1.0

我的问题是,a/=2*ba=a/2*b 不是一回事吗?因此,在考虑 a=a/2*b 时,不应该首先考虑除法,因为左侧绑定,然后再考虑乘法。

a = 6 → 6/2 = 3.0

3.0 * b = 9.0.

所以 9.0 不应该是答案。请给我解释一下。

语句 a /= 2 * b 等价于 a /= (2 * b),而不是 (a /= 2) * b,这在 Python 中没有意义。

如果您确实将其解释为 (a /= 2) * b,那么它将扩展为 (a = a / 2) * b,而不是 a = (a / 2) * b。这在 Python 中是不允许的,因为 a = a / 2 不是表达式,它不会产生可以乘以 b.

的值

答案是赋值运算符 _ = _ 和扩充赋值运算符如 _ /= _ 的优先级低于其他运算符(如 _ * __ / _ ),并且它们在句法上是“右结合”的,因此 a = b = c 将结果 c 分配给 ab;但是,写成等同于 a = (b = c) 是不正确的,因为由于上述原因,这在 Python 中没有意义。尽管如此,_ ** _ 并不是 Python 中唯一的右结合运算符:另一个是三元运算符 _ if _ else _,其中表达式 a if b else c if d else e 等价于 a if b else (c if d else e) , 不是 (a if b else c) if d else e.

Python 遵循数学中常用的运算顺序,其中指数优先于 multiplication/division,指数优先于 addition/subtraction。复合运算符是此顺序中的最后一个。因此,在您的示例中,首先评估 2*b 和 returns 6。然后评估 a/=6 和 returns 1.