问题描述
我是 Python 新手,我仍在学习。我在使用运算符时学习了左侧绑定的概念(并且被教导只有幂运算使用右侧绑定)。还告诉我,*
和 /
具有相同的优先级,并且运算符的绑定决定了某些具有相同优先级的运算符执行的计算顺序,并排在一个表达式中。
但是现在在教授复合赋值运算符时,他们使用了以下示例
a = 6
b = 3
a /= 2 * b
print(a)
给出的答案是1.0
。
他们给出的解释如下。
2 * b = 6
a = 6 → 6 / 6 = 1.0
我的问题是,a/=2*b
和 a=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
分配给 a
和 b
;然而,将 this 写成等价于 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)
,而不是 {{ 1}}。
Python 遵循数学中常用的运算顺序,其中指数优先于乘法/除法,而指数优先于加法/减法。复合运算符是此顺序中的最后一个。因此,在您的示例中,首先评估 2*b 并返回 6。然后评估 a/=6 并返回 1。