【问题标题】:Python: var = var / 5 * 2 does not evaluate the same as var /= 5 * 2Python:var = var / 5 * 2 的计算结果与 var /= 5 * 2 不同
【发布时间】:2020-05-21 18:50:05
【问题描述】:

我是 Python 新手,我无法弄清楚这一点。我确信这是我忽略的非常简单的事情。

我正在学习 Python 中的复合赋值运算符,我了解到这个表达式:

var = var / 5 * 2

可以用 /= 操作符写成:

var /= 5 * 2

这是我不明白的。如果我设置 var = 20 然后求解这个表达式:

var = var / 5 * 2
var = 20 / 5 * 2
var = 4 * 2
var = 8

我的答案是 8。

如果我将 'var = var / 5 * 2' 放入 IDLE,我会得到 8 作为 var 的新值。

但是,如果我把 var 放回 20 并在 IDLE 中求解这个表达式:

var /= 5 * 2

我得到的答案是 2.0 作为 var 的新值。

我不明白为什么在使用复合赋值运算符时会得到不同的结果?

如果我设置 var = 20 并解决这个表达式:

var = var / (5 * 2)
var = 20 / (10)
var = 2.0

然后我在不使用复合赋值运算符的情况下得到相同的答案。

因此,似乎 /= 运算符默认为表达式添加了括号。这就是正在发生的事情吗?如果我不了解如何正确使用复合赋值运算符,我可以看到这会导致很多错误。

如果有人能向我解释这一点,我将不胜感激。谢谢!

【问题讨论】:

  • 使用augmented assignment,首先计算右侧,然后执行除等于。
  • 该化合物不会在其周围添加 () - 它会在右侧执行所需的操作。如果你想除以 5,然后乘以 2 执行 var /= 5,然后是 var *= 2。或者改用var *= 2/5
  • 当你看到 /= 或 += 或 -=... 那里的操作符将被最后执行
  • 知道了。因此,这不仅仅是将表达式 x = x y 转换为 x =y 的简单转换。您必须了解规则,并且可能需要重新编写表达式才能正确评估。我想在简单的例子中,这只是一个简单的转换,但对于更复杂的表达式,你必须“制作”正确的表达式以确保它的计算正确。

标签: python operators variable-assignment


【解决方案1】:
var / 5 * 2

意思

(var / 5) * 2

因为算术规则是这样说的,任何其他结果都是不正确的。

反之,

var /= 5 * 2

表示“将var除以右边的表达式并更新var” 所以它相当于

var = var / (5 * 2)

并且没有其他结果是有意义的。

如果您希望这些命令以不同方式进行评估,请调整您的期望,或始终使用括号来确保含义清晰。

【讨论】:

    【解决方案2】:

    这里的重点是运算符的优先级。 当您使用 var= var / 5 * 2 时,由于优先级,首先发生除法,然后发生乘法。但是当您使用 var/= 5 * 2 时, * 的优先级高于 /= ,因此稍后对其进行评估,您会得到 2.0 作为答案。 只需引用一次运算符的优先级。 希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      任务

      var /= 5 * 2
      

      For var=20 表示 Python 在左侧将 var 评估为 20,在右侧将 5 * 2 评估为 10,然后在可能的情况下就地更改 var(不可能这里是int) 到20/10,即2

      【讨论】:

        【解决方案4】:

        简单,兄弟 检查运算符的运算符优先级。像 +,-,*,/,% 这样的算术运算符总是比复合运算符具有更高的优先级。 这就是为什么var = 20 / 5 * 2 => 4*2=8.0('/' 的优先级高于 *(星号))和 var1=20, var1 /=5*2 => 20/10=2.0(星号的优先级高于复合运算符)。

        希望你能明白。

        检查此:https://www.tldp.org/LDP/abs/html/opprecedence.html 了解信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-02
          • 2020-08-05
          • 2020-08-31
          • 1970-01-01
          • 2019-12-02
          • 2018-08-01
          相关资源
          最近更新 更多