2011-06-26 112 views
4
a,b = 0,1 
while b < 50: 
    print(b) 
    a = b 
    b = a+b 

輸出:Python變量賦值問題

1 
2 
4 
8 
16 
32 

wheras:

a,b = 0,1 
while b < 50: 
    print(b) 
    a,b = b, a+b 

輸出(正確的斐波納契數列):

1 
1 
2 
3 
5 
8 
13 
21 
34 

他們不是一樣嗎?我的意思是a,b = b, a+b基本上和a = bb = a+b分開寫 - 不是嗎?

回答

11

不,他們不一樣。

當您編寫a,b = b, a+b時,分配「同時」完成。 a,b = b, a+b(a, b) = (b, a+b)相同。所以,

a, b = 5, 8 

a = 5和b = 8。當Python看到此

(a, b) = (b, a+b) 

首先計算右側(b, a+b)其是(8,13),然後分配(該元組)向左側,到(a,b)


當你有:a = b然後b = a+b,這兩個操作完成一個接一個。但是,對於他們中的每一個:

a = b 

先計算右側b,然後受讓人(此值)左側,以a。並再次

b = a + b 

先計算右側a + b,然後受讓人(此值)左側,以b

+0

AAAH好的!謝謝。 :) – 3zzy

+0

元組是不可變的,所以任何進入元組的元素都將被保留(只讀)。即使A和B分配在左側,也會首先創建右側的元組(從右向左分配)。 – pokstad

+2

不僅「技術上同時」錯誤,而且會混淆問題。關鍵的一點是,在進行任何分配之前,評估右側的表達式。所以'a = a + b'和'a,b = b,a + b'確實沒有區別 - 在這兩種情況下,右邊的值都是使用'a'的「舊」值和' B'。 – senderle

5

他們是不一樣的。在第一個示例中,a分配的值爲b,然後將其新值添加到b。有效b + b

在第二個示例中,將爲a指定當前值b,並將b指定爲當前值a加上當前值b。它發生在a的值更改之前。

這兩個任務同時發生而不是順序發生。

5

這些陳述是不同的。

a = b 
b = a+b 

修改a,然後使用修改後的值來改變b。實際上,它始終是b = b + b

a,b = b, a+b 

發生在同一時刻ba,使b使用原a值來計算。

3

對於這一點:在右側

a,b = b, a+b 

一切都先評估,然後分配到左側。因此,在左側的分配改變它之前,您正在使用右側的a的值。

對於這一點:

a = b 
b = a+b 

執行第二語句之前的a值被改變。所以你的結果是不同的。

1

第二個例子表示一個元組用於執行「同時」分配。

(A,B)=(B,A+B) 

元組是不可變的,這意味着它們的內容一旦設置就不能改變。另外,Python從右向左處理分配。因此,當創建右側的元組時,即使在左側爲A & B分配了新值,值也不會更改。

+1

「Simultaneous」在引號中,因爲它在內部不會同時執行兩個分配。 – pokstad

+0

同意,「同時」混淆了這個問題。關鍵是在執行任何分配之前評估右側的表達式。這與'a = a + b'沒有什麼不同。 – senderle

0

如何在同一時間做了兩個賦值操作:

a,b = b,a+b:先在後臺,我認爲Python分配a+b一個變量讓我們把它叫做x並分配b給一個變量讓我們把它叫做y然後,分配xbya

我想的概念「同時」是不是由邏輯真,在存儲器a值必須首先改變,然後b或者反之亦然,所以a值仍取決於b或反之亦然,除非有另一個變量保持上面的新值。