2012-11-12 51 views
1

我是一名Python初學者。我正在看一個類型,使斐波那契函數,Python - 斐波那契函數變量值聲明之間的區別

def fib(n): 
a=0 
b=1 
while a<n: 
    print a 
    a,b=b,a+b 

我看到a,b = b,a + b聲明。所以,我認爲A = B和B = A + B是相同的,B = A,B + A,所以我改變了功能,它是這樣的:

def fib(n): 
a=0 
b=1 
while a<n: 
    print a 
    a=b 
    b=a+b 

,我認爲這會是對的,但是當我執行程序時,我得到了不同的輸出。有人能向我解釋這兩種聲明之間的區別嗎?

謝謝,無論如何。

+0

請參閱[在python中保證變量是原子嗎?](http://stackoverflow.com/q/2623086) –

回答

0

b, a+b創建一個包含這兩個值的元組。然後a, b = ...解開元組並將其值賦給變量。但是,在您的代碼中,您將覆蓋第一個值,因此第二行使用新值。

a, b = b, a + b 

大致等於:

tmp = a 
a = b 
b = tmp + b 
0

即語法基於所述電流值同時分配新值,以ab。不等價的原因是,當您編寫兩條單獨的語句時,第二個分配使用新的的值a而不是舊的的值爲a

1

當Python執行

a,b = b, a+b 

evaluates the right-hand side first,然後解包元組和值分配給ab。請注意,右側的a+b正在使用a舊的值。

當Python執行

a=b 
b=a+b 

它計算b並分配它的值a。 然後它評估a+b並將該值分配給b。現在注意a+b正在使用新的值爲a

0

在第一個例子中,不更新,直到整個行被評價採取b的值 - 所以B實際上是A + B。

在你的例子中,你已經設置爲b,所以最後一行(b = a + b)可以很容易地是b = b + b。

這一切都按評估事物的順序進行。