2013-02-18 201 views
0

我在Project euler上工作,雖然這不在話下。我正在編寫一個快速代碼來打印斐波那契序列。但事實上我對這個項目eueler方程不同的代碼,但是這基本上是我使用的算法:爲什麼只有當我使用'x,y = y,x + y格式而不是'x = y; y = x + y'?

x = 1 
y = 0 
while x < 4000000: 
    print x 
    x = y 
    y = x + y 

這是erking我一段時間,這應該有工作。然後,我研究了一下,發現了幾乎相同的代碼,但格式有點不同。它的工作!唯一的區別是它將x和y的賦值放在一行中,用逗號分隔。所以我試了一下:

x , y = 1 , 0 
while x < 4000000: 
    print x 
    x,y = y, x + y 

顯然,正如我所說,它的工作。這真是困擾我,因爲我無法弄清楚除了聰明和在第二行使用較少的行之外,兩者之間的區別。我不明白爲什麼輸出不同。爲什麼輸出不同?

回答

6

在您的第一個代碼中:

x = y 
y = x + y 

您實際上將y + y指定爲y。由於x的值已被覆蓋。這不是你想要的嗎?


而在你的第二個代碼:

x, y = y, x + y 

首先y並在RHS x + y進行評估,然後評估值分配給x, y的LHS。因此,x + y將不會像第一種情況中發生的那樣對x新分配的值產生任何副作用。所以,你的y將只有x + y

所以,這只是evaluation這兩個表達式在RHS上的情況,在實際分配完成之前。

是的,你的while循環之外的任務不會有任何區別。但第二種方式看起來更具吸引力。

0

我猜想,在第二個版本中,當它評估y, x+y時,它使用x + y中的原始值x。

在兩行版本,當判斷x+y x已經被設置爲y導致X + Y是一樣y+y

+0

我在想同樣的事情,這將意味着最後一行評估爲y = 0 + 0.我認爲如果你用工作版本中的最後一行替換原來的最後兩行,兩個版本w將按預期工作。 – 2013-02-18 23:44:21

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.

0

在第一個版本中,第一個賦值更改了x的值。這會影響下一行分配中的值。這意味着y = x + y更像是y = y+y,因爲您已經更改了x。

在第二個版本中,兩個賦值是同時完成的,因此兩個值都是同時更新的。

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 
相關問題