0

我正在研究 euler 项目,不过这无关紧要。我正在编写一个快速代码来打印出斐波那契数列。实际上,我对项目欧拉方程有不同的代码,但这本质上是我正在使用的算法:

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

显然,正如我所说,它奏效了。这真的让我很困扰,因为除了聪明并在第二个中使用更少的行之外,我无法弄清楚两者之间的区别。我不明白为什么输出不同。为什么输出不一样?

4

5 回答 5

6

在您的第一个代码中:

x = y
y = x + y

您实际上是分配y + yy. 由于 的值x已经被覆盖。这不是你想要的吗?


在您的第二个代码中:

x, y = y, x + y

首先在 RHSyx + y进行评估,然后将评估值分配给x, yLHS。因此,不会像第一种情况那样x + y对新分配的值产生任何副作用。x所以,你的y意志只有x + y.

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

是的,您的 while 循环之外的分配不会有任何区别。但是第二种方式看起来更有吸引力。

于 2013-02-18T23:44:50.410 回答
0

我猜想在第二个版本中,当它评估时,y, x+y它使用 x+y 中 x 的原始值。

在两行版本中,当它评估时x+yx 已设置为 y 这导致 x+y 与y+y

于 2013-02-18T23:43:15.280 回答
0

你重新分配 x。

让我们举一个数字示例

情况1:

x = 4
y = 2
x = y = 4
y = x + y = 4 + 4 = 8

案例二:

x = 4
y = 2
x, y = y, x + y = 2, 4 + 2 = 2, 6

因此,在第一种情况下,x 为 4,y 为 8,而在第二种情况下,x 为 2,y 为 6。

于 2013-02-18T23:44:47.847 回答
0

在第一个版本中,第一个赋值改变了 x 的值。这会影响下一行赋值中的值。这意味着y = x + y更像是y = y+y因为您已经更改了 x。

在第二个版本中,两个赋值是同时完成的,所以两个值同时更新。

于 2013-02-18T23:45:11.990 回答
0

这是因为在 行之后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
于 2013-02-18T23:52:21.877 回答