0

可能重複:
Multiple assignment in Python訂單在Python評價不明確

正如我們正確的教訓,因爲我們開始使用C,在一個線程工作時,一臺計算機上,所有操作一個接一個地發生。

我對Python 3語言有疑問。

a,b = b,a 

或爲斐波納契數列使用::我看到了使用表達式交換變量值碼

a,b = b,a+b 

哪有這些工作?但他們的工作:O

是否Python系統內部創建這些臨時變量?賦值的順序是什麼,以便有效地給出正確的結果?

問候, 尼基爾

回答

4

在高層次上,您將創建兩個元組,即左側和右側,並向左分配正確的元組,從而將變量逐個更改爲其對立面。 Python是一種更高級的語言,因此與C語言相比,這樣的抽象更多。

在較低的級別,您可以很清楚地看到使用dis模塊發生了什麼,它可以向您顯示一個函數的Python字節碼:

>>> import dis 
>>> def test(x, y): 
...  x, y = y, x 
... 
>>> dis.dis(test) 
    2   0 LOAD_FAST    1 (y) 
       3 LOAD_FAST    0 (x) 
       6 ROT_TWO    
       7 STORE_FAST    0 (x) 
      10 STORE_FAST    1 (y) 
      13 LOAD_CONST    0 (None) 
      16 RETURN_VALUE  

會發生什麼事是它採用ROT_TWO交換堆棧,這是這樣做的一個非常有效的方式對項目的順序。

+0

非常感謝... ^^ –

+1

有一兩件事要小心這裏:作爲beggining這個答案的狀態,我們不得不認爲Python首先創建一個元組(因此,是的,作爲OP看跌期權「,一些臨時變量爲這些「是在元組對象的形式上創建的,在處理完右邊的哈德邊後,它的值將按順序分配給左邊的名字,顯示的字節碼的意外是2元組創建在這個特例中被忽略 - 我們必須記住它是一個編譯器優化。 – jsbueno

0

當你寫a, b,創建tuple

>>> 1, 2 
(1, 2) 

所以,沒有什麼特別的評價順序。

0

從斐波那契的例子a=1b=1。首先,評估右側:b,a+b導致元組(1,2)。接下來,將右側分配給左側,即ab。所以是的,右側的評估存儲在內存中,然後ab更改爲指向這些新值。