正如我們正確的教訓,因爲我們開始使用C,在一個線程工作時,一臺計算機上,所有操作一個接一個地發生。
我對Python 3語言有疑問。
a,b = b,a
或爲斐波納契數列使用::我看到了使用表達式交換變量值碼
a,b = b,a+b
哪有這些工作?但他們的工作:O
是否Python系統內部創建這些臨時變量?賦值的順序是什麼,以便有效地給出正確的結果?
問候, 尼基爾
正如我們正確的教訓,因爲我們開始使用C,在一個線程工作時,一臺計算機上,所有操作一個接一個地發生。
我對Python 3語言有疑問。
a,b = b,a
或爲斐波納契數列使用::我看到了使用表達式交換變量值碼
a,b = b,a+b
哪有這些工作?但他們的工作:O
是否Python系統內部創建這些臨時變量?賦值的順序是什麼,以便有效地給出正確的結果?
問候, 尼基爾
在高層次上,您將創建兩個元組,即左側和右側,並向左分配正確的元組,從而將變量逐個更改爲其對立面。 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
交換堆棧,這是這樣做的一個非常有效的方式對項目的順序。
當你寫a, b
,創建tuple
。
>>> 1, 2
(1, 2)
所以,沒有什麼特別的評價順序。
從斐波那契的例子a=1
和b=1
。首先,評估右側:b,a+b
導致元組(1,2)
。接下來,將右側分配給左側,即a
和b
。所以是的,右側的評估存儲在內存中,然後a
和b
更改爲指向這些新值。
非常感謝... ^^ –
有一兩件事要小心這裏:作爲beggining這個答案的狀態,我們不得不認爲Python首先創建一個元組(因此,是的,作爲OP看跌期權「,一些臨時變量爲這些「是在元組對象的形式上創建的,在處理完右邊的哈德邊後,它的值將按順序分配給左邊的名字,顯示的字節碼的意外是2元組創建在這個特例中被忽略 - 我們必須記住它是一個編譯器優化。 – jsbueno