为什么此代码仅在我使用' x,y = y,x + y格式而不是' x = y时才有效; y = x + y'?

时间:2013-02-18 23:41:08

标签: python variables

我正在研究Project euler,但这不是重点。我正在编写一个快速代码来打印出Fibonacci序列。实际上我对项目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

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

5 个答案:

答案 0 :(得分:6)

在您的第一个代码中:

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

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

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

答案 1 :(得分:0)

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

在双行版本中,当评估x+y时,x已设置为y,导致x + y与y+y相同

答案 2 :(得分:0)

您重新分配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。

答案 3 :(得分:0)

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

在第二个版本中,两个分配同时完成,因此两个值都会同时更新。

答案 4 :(得分: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