[英]Why does this code only work when i use 'x,y = y,x + y format instead of 'x = y; y = x + y'?
我正在研究欧拉计画,尽管那不是重点。 我正在写一个快速代码以打印出斐波那契数列。 我实际上对项目eueler方程有一个不同的代码,但这实际上是我正在使用的算法:
x = 1
y = 0
while x < 4000000:
print x
x = y
y = x + y
这让我有些困扰,这本来应该起作用的。 然后,我进行了一些研究,发现几乎相同的代码,但格式略有不同。 而且有效! 唯一的区别是将x和y分配放在一行中,并用逗号分隔。 所以我尝试了:
x , y = 1 , 0
while x < 4000000:
print x
x,y = y, x + y
显然,正如我所说,它确实有效。 这真的让我感到困扰,因为我不知道除了聪明和在第二句中使用更少的行以外,两者之间还有什么区别。 我不明白为什么输出不同。 为什么输出不同?
在您的第一个代码中:
x = y
y = x + y
您实际上是将y + y
分配给y
。 由于x
的值已被覆盖。 这不是您想要的吗?
在第二个代码中:
x, y = y, x + y
首先评估RHS上的y
和x + y
,然后将评估值分配给LHS上的x, y
。 因此, x + y
不会像在第一种情况下那样,给x
赋新的值。 因此,您的y
只有x + y
。
因此,这只是在实际分配完成之前在RHS
上evaluation
这两个表达式的情况。
是的,while循环之外的分配不会有任何区别。 但是第二种方式看起来更有吸引力。
我猜想在第二个版本中,当它计算y, x+y
会使用y, x+y
中x的原始值。
在两行版本中,当它求x+y
x已设置为y,这导致x + y与y+y
相同
您重新分配x。
让我们举一个数字例子
情况1:
x = 4
y = 2
x = y = 4
y = x + y = 4 + 4 = 8
情况2:
x = 4
y = 2
x, y = y, x + y = 2, 4 + 2 = 2, 6
因此,在第一种情况下,x为4,y为8,而在第二种情况下,x为2,y为6。
在第一个版本中,第一个分配更改x的值。 这会影响下一行中分配中的值。 这意味着y = x + y
更像y = y+y
因为您已经更改了x。
在第二版中,两个分配同时完成,因此两个值都同时更新。
这是因为在x = y
行之后,第二行( y = x + y
)被评估为y = y + y
。 例如,假设x = 2且y = 3。
然后,
x = y # i.e. x = 3 now
y = x + y # i.e. y = 3 + 3 = 6 (while you wanted it to be 5)
另一方面,
x, y = y, x + y # this first assigns values to the right hand side
所以,
x, y = 3, 2 + 3 # i.e x, y = 3, 5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.