【问题标题】:Regarding left-sided Binding in Python关于 Python 中的左侧绑定
【发布时间】:2021-05-17 03:15:08
【问题描述】:

我是 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 不应该是答案。请给我解释一下。

【问题讨论】:

    标签: python operator-precedence


    【解决方案1】:

    语句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

    【讨论】:

      【解决方案2】:

      Python 遵循数学中通常使用的运算顺序,其中指数优先于乘法/除法,而它们反过来又高于加法/减法。复合运算符按此顺序排在最后。因此,在您的示例中,首先评估 2*b 并返回 6。然后评估 a/=6 并返回 1。

      【讨论】:

      • “数学中使用的通常运算顺序”并不能解释像/=这样的运算符的优先级,它们存在于编程中,但不存在于数学中。
      • @kaya3。确切地。这就是为什么我补充说复合运算符的优先级最低。
      • 在“此顺序的最后一个”中,“此顺序”似乎是指答案中前面提到的“通常的操作顺序”;这就是我要指出的。
      • 速记运算符的优先级低于算术运算符。
      猜你喜欢
      • 2015-01-10
      • 2014-10-25
      • 2010-11-26
      • 2017-06-22
      • 2017-03-31
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多