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

在Python中给出不同结果的基本操作,python,Python,我在Python3中尝试了一些基本操作,遇到了这个问题 代码1: a = 6 b = 3 a = a / 2 * b print(a) a = 6 b = 3 a /= 2 * b print(a) 输出为9.0 在其中一次训练中,我看到了这一点 a = a / 2 可以写成 a /= 2 所以我重新编写了上面的代码,如下所示 代码2: a = 6 b = 3 a = a / 2 * b print(a) a = 6 b = 3 a /= 2 * b print(a) 但是现在输出

我在Python3中尝试了一些基本操作,遇到了这个问题

代码1:

a = 6
b = 3
a = a / 2 * b
print(a)
a = 6
b = 3
a /= 2 * b
print(a)
输出为
9.0

在其中一次训练中,我看到了这一点

a = a / 2 
可以写成

a /= 2
所以我重新编写了上面的代码,如下所示

代码2:

a = 6
b = 3
a = a / 2 * b
print(a)
a = 6
b = 3
a /= 2 * b
print(a)
但是现在输出是
1.0

我期望9.0作为输出。有人能帮我理解为什么代码会这样吗?

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 / 2) * b
第二个是

a / (2 * b)
关于你的评论

a=a/2
a/=2
总是等价的,对吗

对于内置python数字,您是对的


对于您自己的类,您可以使操作有所不同。如果
a
是一个定制类的疯子
a/x
将调用
\uu truediv\uuuuuuuuu(self,other)
,而
a/=x
将调用
\uu itruediv\uuuuself,other)
,如中所述。

我很惊讶其他答案中没有提到这一点,但原因与数学无关,操作顺序或隐式括号


x/=y
只是说
x的另一种方式。第二个示例与第一个示例不同,因为参数是在传递到函数调用之前进行计算的。因此,
a/=2*b
相当于
a.\uuu itruediv\uuuu(2*b)
,自然地,表达式
2*b
在传递到
\uu itruediv\uuuuu

之前必须进行求值,这是关于操作的优先级。。。第一个是
(a/2)*b
;第二个
a/(2*b)
。这里没有括号。当我没有括号时,python会假定有括号吗?python会做出(有文档记录的[从左到右])选择。这是必须的。你似乎也能想象这里的括号。。。只是不同的操作。添加了一个答案;我的回答太长,无法发表评论。这是否回答了你的问题?好的..明白了..但是在这种情况下,说a=a/2和a/=2总是相等是错误的,对吗?这是否意味着,即使我没有明确提到括号,python在第二种情况下也会这样做?@AbrahamPanicker每种语言都这样做。这不是关于python,而是关于算法。是的。我得到了获取不同值背后的逻辑,但我的问题是,我们怎么能说a=a/2和a/=2总是等价的。这完全取决于在第一次表达之后是否还有更多的表达你有没有一个例子来说明你的意思?在
/=
的情况下,右侧的所有内容都将在除法(和分配)之前计算。是的……您可以将任何进一步的操作添加到右侧,并将其全部视为同一括号的一部分,并在除法之前进行评估,例如a/=2*b+a相当于a=a/(2*b+a)Hiro在之前的评论中提到了它,并提供了到python数据模型文档的链接:)