[英]Basic operation giving different results in Python
我在 Python 3 中玩了一些基本操作并遇到了这个
代码 1:
a = 6
b = 3
a = a / 2 * b
print(a)
Output 为9.0
在我见过的其中一项培训中
a = a / 2
可以写成
a /= 2
所以我重写了我上面的代码如下
代码 2:
a = 6
b = 3
a /= 2 * b
print(a)
但是现在 output 是1.0
。 我期待 9.0 作为 output。 有人可以帮我理解为什么代码会这样吗?
在a /= 2 * b
的情况下,您说a
将在/=
之后除以表达式。
换句话说,您的表达式可以重写为a = a / (2 * b)
其中a = 6, b = 3
在
a /= 2 * b
2 * b 首先执行,所以如果 b == 3 它可以重写为:
a /= 6
那是因为它们以不同的顺序执行操作。
第一个代码块将 a (6) 除以 2,然后将结果乘以 b (3)
例如 (6 / 2) * 3 = 9
但是,第二个代码块执行以下操作:
6 / (2 * 3) = 1
注意
a /= 2 * b
基本上是
a = a / (2 * b)
前面的代码不同。 和上面的不一样(看括号)
a = a / 2 * b
这不同于
a = a / (2 * b)
因为第一个代码将其解释为除法然后乘法,而第二个代码将其解释为乘法(底部)然后除法。
正如您在有关运算符优先级的文档中看到的那样*
和/
具有相同的优先级。 从左到右执行两个优先级相同的操作:
同一框组中的运算符从左到右
所以你的第一个例子被评估为
(a / 2) * b
第二个作为
a / (2 * b)
关于你的评论
a = a / 2
和a /= 2
总是等价的,对吧?
对于内置的 python 数字,您是对的。
对于您自己的课程,您可以使操作有所不同。 如果a
是自定义 class 的实例,则a/x
将调用__truediv__(self, other)
而a/=x
将调用__itruediv__(self, other)
,如数据 model中所述。
我很惊讶其他答案都没有提到这一点,但原因与数学、运算顺序或隐式括号没有任何关系。
x /= y
只是x.__itruediv__(y)
的另一种说法。 您的第二个示例不等同于您的第一个示例,因为参数在传递给 function 调用之前进行了评估。 因此, a /= 2 * b
等价于a.__itruediv__(2 * b)
,当然,表达式2 * b
必须在传递给__itruediv__
之前进行计算。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.