Python 变量通过相同的操作获得不同的值

Python 变量通过相同的操作获得不同的值,python,python-3.x,Python,Python 3.x,这是一个基本的理解问题 我试着对一些代码重新排序,虽然这些操作应该是等价的,但我得到了不同的值。 我从这句话开始: q, r, m = 10*q, 10*(r-m*t), (10*(3*q+r))//t - 10*m 并将其更改为: q*=10; r=10*(r-m*t); m= (10*(3*q+r))//t - 10*m; (初始值为q=1、r=6、t=3、m=3) 当我只运行第二行时,m得到值-30(如果我正确地遵循操作顺序,这是准确的),而运行第一行得到m=0,这是程序调用的

这是一个基本的理解问题

我试着对一些代码重新排序,虽然这些操作应该是等价的,但我得到了不同的值。 我从这句话开始:

q, r, m = 10*q, 10*(r-m*t), (10*(3*q+r))//t - 10*m
并将其更改为:

q*=10;  r=10*(r-m*t);   m= (10*(3*q+r))//t - 10*m;
(初始值为q=1、r=6、t=3、m=3)

当我只运行第二行时,m得到值-30(如果我正确地遵循操作顺序,这是准确的),而运行第一行得到m=0,这是程序调用的


我错过了什么?逗号方法是否在完成所有其他赋值后赋值?

问题是,在将结果赋值给
q
r
m
变量之前,您的第一段代码会对右侧的每个表达式求值。您的第二个代码段将指定:

q*=10
r=10*(r-m*t)
-在评估之前:

m= (10*(3*q+r))//t - 10*m
这会改变结果。如果必须使用后一个代码段,则需要引入一个临时变量来存储原始
q
r
变量值,以便在最终表达式中使用

事实上,由于
q
不依赖于其他变量中的任何一个,您实际上可以最后分配其值,保持其他两个在tract中,以稍微简化表达式:

r, m = 10*(r-m*t), (10*(3*q+r))//t - 10*m
q *= 10

在第一种情况下,在完成任何赋值之前,所有赋值都使用变量的值

在第二种情况下,您先更改一些变量,然后再更改其他变量(以后的赋值使用变量的新值)


a,b=b,a
a=b进行比较;b=a
。第一个将交换值,第二个将不交换。

q,r,m=10*q,10*(r-m*t),(10*(3*q+r))//t-10*m
中的赋值是通过计算所有赋值的右侧而独立完成的,不会影响其他赋值,这意味着当计算
(10*(3*q+r))//t-10*m
时,使用的是
q
的旧值,而不是新的
10*q
(与
r
相同)。请注意,唯一的区别在于
m
的值,这取决于
r
q
的值,它们在分配
m
时不会改变。

使用
x,y=foo,bar
语法时,所有语句都会在将值分配给变量之前执行。使用
x=foo时;y=bar
,它们不是。所以就这么简单。。我想对于代码注释来说,在各个方面都更好,因为您可以安全地提取
q
赋值。详见我的答案