微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于 Python 中的左侧绑定

如何解决关于 Python 中的左侧绑定

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

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

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;然而,将 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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。