Heim >Backend-Entwicklung >Python-Tutorial >Wie tauscht Python Tupelwerte aus, ohne eine temporäre Variable zu verwenden?
In Python das Vertauschen der Werte zweier Variablen mithilfe einer Tupelzuweisung wie (a, b) = (b, a) Vielleicht scheint es ein einfacher Trick zu sein, aber wie funktioniert er intern ohne eine temporäre Variable?
Python wertet den Ausdruck auf der rechten Seite der Zuweisung getrennt vom Ausdruck auf der linken Seite aus. Sobald die rechte Seite berechnet ist, wird das Ergebnis auf dem Stapel gespeichert. Anschließend werden die Namen auf der linken Seite mithilfe von Opcodes zugewiesen, die direkt auf dem Stapel ausgeführt werden.
Für Tupelzuweisungen mit zwei oder drei Elementen verwendet Python den Stapel direkt mithilfe der Opcodes ROT_TWO oder ROT_THREE, um Elemente auszutauschen. Zum Beispiel:
def foo(a, b): a, b = b, a
Das Zerlegen dieser Funktion mit dis.dis(foo) zeigt Folgendes:
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
Hier vertauscht ROT_TWO die beiden obersten Werte auf dem Stapel und kehrt sie effektiv um Reihenfolge von a und b.
Für Aufgaben, die mehr umfassen Wenn mehr als drei Elemente vorhanden sind, erstellt Python ein Zwischentupel auf dem Stapel. Betrachten Sie dieses Beispiel:
def bar(a, b, c, d): d, c, b, a = a, b, c, d
Seine Zerlegung zeigt:
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 erstellt ein Tupel aus den Werten auf dem Stapel in umgekehrter Reihenfolge. Dann öffnet UNPACK_SEQUENCE das Tupel und legt seine Elemente zurück auf den Stapel, um sie den Variablen auf der linken Seite zuzuweisen.
Während UNPACK_SEQUENCE für Zuweisungen mit zwei oder drei Elementen redundant erscheint, a Ein späterer Optimierungsschritt ersetzt die BUILD_TUPLE/UNPACK_SEQUENCE-Kombination durch die effizienteren Opcodes ROT_TWO oder ROT_THREE. Stellen Sie sicher, dass der Austauschmechanismus so rational wie möglich ist.
Das obige ist der detaillierte Inhalt vonWie tauscht Python Tupelwerte aus, ohne eine temporäre Variable zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!