繁体   English   中英

在 Python 中给出不同结果的基本操作

[英]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 / 2a /= 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM