Heim >Backend-Entwicklung >Python-Tutorial >Wie tauscht Python Tupelwerte aus, ohne eine temporäre Variable zu verwenden?

Wie tauscht Python Tupelwerte aus, ohne eine temporäre Variable zu verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-28 09:07:10312Durchsuche

How does Python swap tuple values without using a temporary variable?

Werte in Tupeln austauschen: Ein Blick ins Innere

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?

Stack Manipulation

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.

Tupelkonstruktion und Auspacken

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.

Optimierung

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn