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

011*_*100 0 python variables

我正在研究Project euler,尽管如此.我正在编写一个快速代码来打印出Fibonacci序列.我实际上有一个不同的项目eueler方程的代码,但这实际上是我使用的算法:

x = 1
y = 0
while x < 4000000:
    print x
    x = y
    y = x + y
Run Code Online (Sandbox Code Playgroud)

这让我有一段时间了,这本来应该有效.然后我研究了一下,发现几乎相同的代码,但有点不同的格式.它奏效了!唯一的区别是它将x和y赋值放在一行中,用逗号分隔.所以我试了一下:

x , y = 1 , 0
while x < 4000000:
    print x
    x,y = y, x + y
Run Code Online (Sandbox Code Playgroud)

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

Roh*_*ain 6

在你的第一个代码中:

x = y
y = x + y
Run Code Online (Sandbox Code Playgroud)

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


在你的第二个代码中:

x, y = y, x + y
Run Code Online (Sandbox Code Playgroud)

第一yx + y在RHS被评估,然后评价值被分配给x, y在LHS.因此,x + y不会x像第一种情况那样对新分配的值产生任何副作用.所以,你的y意志只有x + y.

因此,在实际分配完成之前evaluation,这两个表达式RHS都是如此.

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