在Python 中,使用元組賦值交換兩個變數的值,如(a, b) = ( b, a)可能看起來是一個簡單的技巧,但是如果沒有臨時變量,它是如何在內部工作的?
Python 與左側分開計算賦值的右側表達式。一旦計算出右側,其結果就會儲存在堆疊中。然後,使用直接在堆疊上操作的操作碼分配左側名稱。
對於具有兩個或三個項目的元組分配,Python 使用 ROT_TWO 或 ROT_THREE 操作碼直接利用堆疊來交換元素。例如:
def foo(a, b): a, b = b, a
使用dis.dis(foo) 反彙編此函數會發現以下內容:
2 0 LOAD_FAST 1 (b) 3 LOAD_FAST 0 (a) 6 ROT_TWO 7 STORE_FAST 0 (a) 10 STORE_FAST 1 (b) 13 LOAD_CONST 0 (None) 16 RETURN_VALUE
這裡,ROT_TWO 交換了堆疊上的前兩個值,有效地反轉了a 和b 的順序。
用於作業涉及三個以上元素時,Python 在堆疊上建構一個中間元組。考慮這個例子:
def bar(a, b, c, d): d, c, b, a = a, b, c, d
它的反彙編顯示:
2 0 LOAD_FAST 0 (a) 3 LOAD_FAST 1 (b) 6 LOAD_FAST 2 (c) 9 LOAD_FAST 3 (d) 12 BUILD_TUPLE 4 15 UNPACK_SEQUENCE 4 18 STORE_FAST 3 (d) 21 STORE_FAST 2 (c) 24 STORE_FAST 1 (b) 27 STORE_FAST 0 (a) 30 LOAD_CONST 0 (None) 33 RETURN_VALUE
BUILD_TUPLE 從堆疊上的值以相反的順序建立一個元組。然後,UNPACK_SEQUENCE 彈出元組並將其元素放回堆疊以分配給左側變數。
雖然UNPACK_SEQUENCE 對於兩個或三個項目分配顯得多餘,但後面的最佳化步驟將BUILD_TUPLE/UNPACK_SEQUENCE 組合替換為更有效率的ROT_TWO 或ROT_THREE操作碼,確保交換機制盡可能簡化。
以上是Python 如何在不使用臨時變數的情況下交換元組值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!