繁体   English   中英

为什么只有当我使用'x,y = y,x + y格式而不是'x = y'时,此代码才起作用? y = x + y'?

[英]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上的yx + y ,然后将评估值分配给LHS上的x, y 因此, x + y不会像在第一种情况下那样,给x赋新的值。 因此,您的y只有x + y

因此,这只是在实际分配完成之前在RHSevaluation这两个表达式的情况。

是的,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.

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