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
赋值。详见我的答案