我正在研究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
显然,正如我所说,它有效。这真的让我很烦,因为我无法弄清楚除了聪明并且在第二个中使用更少的线之外,两者之间的区别。我不明白为什么输出不同。为什么输出不同?
答案 0 :(得分:6)
在您的第一个代码中:
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
。
因此,在实际分配完成之前,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