W3docs

Tupel entpacken in Python: Ein umfassender Leitfaden

Python-Tupel entpacken: Grundsyntax, Stern-Ausdrücke, verschachtelte Tupel, Schleifenentpackung und häufige Fallstricke mit klaren, ausführbaren Beispielen.

Tupel-Entpacken (auch Iterable-Entpacken genannt) ermöglicht es, die Elemente eines Tupels — oder eines beliebigen Iterables — in einem einzigen Ausdruck einzelnen Variablen zuzuweisen. Diese Seite behandelt alles von der grundlegenden Syntax bis hin zu fortgeschrittenen Mustern wie Stern-Ausdrücken, verschachteltem Entpacken und schleifenbasiertem Entpacken.

Was ist Tupel-Entpacken?

Wenn Sie ein Tupel entpacken, ordnet Python jedes Element einer entsprechenden Variablen auf der linken Seite von = zu. Die Anzahl der Variablen muss genau mit der Anzahl der Elemente übereinstimmen (es sei denn, Sie verwenden einen Stern-Ausdruck, der weiter unten behandelt wird).

python— editable, runs on the server

Die Klammern um das Tupel sind optional — 1, 2, 3 ist ebenfalls ein Tupel. Beide folgenden Zeilen sind äquivalent:

a, b, c = (1, 2, 3)
a, b, c = 1, 2, 3   # same result

Warum Tupel-Entpacken verwenden?

Kompakte Variablenzuweisung

Ohne Entpacken benötigen Sie eine Zeile pro Element:

python— editable, runs on the server

Variablen tauschen

Das Entpacken macht das Tauschen zweier Werte zu einer einzeiligen Operation. Python wertet die rechte Seite vollständig aus, bevor es zuweist, sodass keine temporäre Variable benötigt wird:

python— editable, runs on the server

Rückgabewerte von Funktionen lesen

Funktionen, die mehrere Werte zurückgeben, geben tatsächlich ein Tupel zurück. Das Entpacken gibt jedem Wert sofort einen aussagekräftigen Namen:

def min_max(numbers):
    return min(numbers), max(numbers)

lo, hi = min_max([3, 1, 4, 1, 5, 9, 2, 6])

print(lo)  # 1
print(hi)  # 9

Ohne Entpacken würden Sie result[0] und result[1] schreiben, was weniger lesbar ist.

Erweitertes Entpacken mit dem Stern-Operator

Wenn Sie die Anzahl der mittleren Elemente nicht kennen (oder sich nicht darum kümmern), setzen Sie einer Variablen * voran, um alles zu erfassen, was keinem benannten Slot entspricht. Die mit Stern versehene Variable erhält immer eine list, auch wenn sie null Elemente erfasst.

Das Ende erfassen

first, *rest = (1, 2, 3, 4, 5)

print(first)  # 1
print(rest)   # [2, 3, 4, 5]

Den Anfang erfassen

*start, last = (1, 2, 3, 4, 5)

print(start)  # [1, 2, 3, 4]
print(last)   # 5

Einen mittleren Abschnitt erfassen

first, *middle, last = (10, 20, 30, 40, 50)

print(first)   # 10
print(middle)  # [20, 30, 40]
print(last)    # 50

Pro Entpackungsausdruck ist nur eine mit Stern versehene Variable erlaubt. Die Verwendung von zwei oder mehr löst einen SyntaxError aus.

Elemente mit _ ignorieren

Die Python-Konvention verwendet _ als Wegwerf-Variablenname. Es ist ein gültiger Bezeichner — Python weist ihm einfach zu —, aber konventionell signalisiert es „Ich brauche diesen Wert nicht."

x, _, z = (10, 99, 30)

print(x)  # 10
print(z)  # 30
# _ holds 99 but we do not use it

Kombinieren Sie _ mit einem Stern-Ausdruck, um viele Elemente zu verwerfen:

first, *_ = (10, 20, 30, 40)

print(first)  # 10
# *_ swallows 20, 30, 40

Verschachteltes Tupel-Entpacken

Wenn ein Tupel ein weiteres Tupel enthält, können Sie beide Ebenen in einem einzigen Ausdruck entpacken, indem Sie die Verschachtelung mit Klammern spiegeln:

python— editable, runs on the server

Dies funktioniert auf beliebiger Tiefe, aber tiefe Verschachtelung beeinträchtigt die Lesbarkeit — ziehen Sie in Betracht, stattdessen schrittweise zu entpacken.

Entpacken in for-Schleifen

Sie können jedes Element eines Iterables direkt in der for-Anweisung entpacken. Dies ist besonders nützlich bei Listen von Tupeln:

pairs = [(1, 'one'), (2, 'two'), (3, 'three')]

for num, word in pairs:
    print(num, word)

# 1 one
# 2 two
# 3 three

Entpacken mit enumerate()

enumerate() gibt (index, value)-Paare zurück, die Sie direkt entpacken können:

fruits = ('apple', 'banana', 'cherry')

for i, fruit in enumerate(fruits):
    print(i, fruit)

# 0 apple
# 1 banana
# 2 cherry

Dies vermeidet manuelles Index-Tracking und ist das idiomatische Python-Muster für das Iterieren über eine Sequenz, wenn Sie sowohl die Position als auch den Wert benötigen.

Entpacken mit zip()

zip() paart Elemente aus zwei Iterables, und Sie können jedes Paar in der Schleife entpacken:

names = ('Alice', 'Bob', 'Carol')
scores = (92, 87, 95)

for name, score in zip(names, scores):
    print(name, score)

# Alice 92
# Bob 87
# Carol 95

Häufige Fehler

Zu viele oder zu wenige Werte

Python löst einen ValueError aus, wenn die Anzahl der Variablen nicht mit der Anzahl der Elemente übereinstimmt (und kein Stern-Ausdruck vorhanden ist):

a, b = (1, 2, 3)
# ValueError: too many values to unpack (expected 2)
a, b, c = (1, 2)
# ValueError: not enough values to unpack (expected 3, got 2)

Beheben Sie die Diskrepanz oder verwenden Sie einen Stern-Ausdruck, um zusätzliche Elemente aufzunehmen.

Zwei mit Stern versehene Variablen

first, *middle, *last = (1, 2, 3, 4)
# SyntaxError: multiple starred expressions in assignment

Pro Entpackungsausdruck ist nur eine *-Variable erlaubt.

Kurzreferenz

MusterBeispielWas es bewirkt
Einfacha, b, c = tWeist jedes Element einer benannten Variablen zu
Stern-Endefirst, *rest = tErstes Element benannt; Rest als list erfasst
Stern-Anfang*start, last = tLetztes Element benannt; Rest als list erfasst
Stern-Mittefirst, *mid, last = tErstes und letztes benannt; Mitte als list erfasst
Eines ignorierenx, _, z = tMittleres Element konventionell verworfen
Viele ignorierenfirst, *_ = tNur erstes Element behalten
Verschachtelta, (b, c), d = tInneres Tupel im gleichen Ausdruck entpackt
Schleifefor x, y in pairs:Jedes Paar pro Iteration entpackt

Verwandte Kapitel

Übungen

Übung
Was weist Python der mit Stern versehenen Variablen zu, wenn Sie `first, *rest = (1, 2, 3, 4, 5)` schreiben?
Was weist Python der mit Stern versehenen Variablen zu, wenn Sie `first, *rest = (1, 2, 3, 4, 5)` schreiben?
Was this page helpful?