Mehrere Werte zuweisen
Mehrere Werte in Python zuweisen: Tuple-Unpacking, ein Wert an viele Variablen, Stern-Zuweisung und häufige Fallstricke mit Beispielen.
Mehrere Werte in Python zuweisen
Python ermöglicht es, in einer einzigen Anweisung Werte an mehrere Variablen zuzuweisen. Im Folgenden werden vier häufige Muster vorgestellt, die im echten Code vorkommen:
- Mehrfachzuweisung — verschiedene Werte an verschiedene Variablen in einer Zeile.
- Verkettete Zuweisung — denselben Wert gleichzeitig an mehrere Variablen.
- Iterable-Unpacking — Elemente aus einer Liste, einem Tuple oder einem anderen Iterable entnehmen.
- Stern-Zuweisung — einen variabel langen „Rest" in einer Liste sammeln.
Jedes Muster wird unten mit ausführbaren Beispielen und den zu beachtenden Fehlern erklärt.
Mehrfachzuweisung (Tuple-Unpacking)
Die gebräuchlichste Form verwendet eine kommagetrennte Liste von Namen auf der linken Seite und eine passende Liste von Werten auf der rechten Seite:
variable1, variable2, variable3 = value1, value2, value3Python verpackt die rechte Seite in ein temporäres Tuple und entpackt es dann von links nach rechts in die Namen auf der linken Seite. Die Anzahl der Namen und Werte muss genau übereinstimmen; andernfalls löst Python einen ValueError aus.
Drei Variablen unterschiedlicher Typen in einer Zeile zuweisen:
Ausgabe:
Python
3.7
TrueDies entspricht dem Schreiben von drei separaten Zuweisungsanweisungen, ist jedoch kompakter und macht die Beziehung zwischen den Namen auf einen Blick deutlich.
Variablen tauschen
Da Python die gesamte rechte Seite auswertet, bevor eine Zuweisung stattfindet, können zwei Variablen ohne eine temporäre Variable getauscht werden:
x = 5
y = 10
# Before swapping
print("Before swapping")
print("x =", x)
print("y =", y)
# Swap in one line — no temp variable needed
x, y = y, x
# After swapping
print("After swapping")
print("x =", x)
print("y =", y)Ausgabe:
Before swapping
x = 5
y = 10
After swapping
x = 10
y = 5In den meisten anderen Sprachen erfordert dieser Tausch eine dritte temporäre Variable. Pythons Tuple-Packing-Semantik macht die Einzeiler-Variante sicher.
ValueError: Anzahl stimmt nicht überein
Wenn die Anzahl der Werte nicht mit der Anzahl der Namen übereinstimmt, löst Python sofort einen ValueError aus:
a, b = 1, 2, 3 # too many values
# ValueError: too many values to unpack (expected 2)
a, b, c = 1, 2 # too few values
# ValueError: not enough values to unpack (expected 3, got 2)Wenn dieser Fehler auftritt, zähle die Namen auf der linken und die Werte auf der rechten Seite — sie müssen gleich sein, oder du benötigst eine Stern-Zuweisung (siehe unten).
Verkettete Zuweisung (ein Wert, viele Variablen)
Um mehreren Variablen denselben Anfangswert zu geben, verkettet man die Zuweisungsoperatoren:
x = y = z = 0
print(x, y, z)Ausgabe:
0 0 0Python wertet 0 einmal aus und bindet alle drei Namen an dasselbe Objekt. Dies funktioniert korrekt für unveränderliche Objekte (Ganzzahlen, Strings, Tuples). Vorsicht bei veränderbaren Standardwerten — alle drei Namen zeigen auf dasselbe Listenobjekt:
# Pitfall: shared mutable object
a = b = c = []
a.append(1)
print(b) # [1] — b is the same list, not a copy!Wenn unabhängige Listen benötigt werden, verwende ein List-Comprehension oder separate Zuweisungen:
a, b, c = [], [], []Ein Iterable entpacken
Jedes Iterable — eine Liste, ein Tuple, ein string, ein range oder ein anderes — kann direkt in Variablen entpackt werden:
a, b, c = [10, 20, 30]
print(a, b, c)Ausgabe:
10 20 30Dies ist derselbe Mechanismus wie bei der Mehrfachzuweisung; Python unterscheidet nicht, ob die rechte Seite ein wörtliches Tuple oder eine Listenvariable ist. Das Entpacken eines Tuple funktioniert beispielsweise identisch:
coords = (51.5, -0.1)
lat, lon = coords
print(lat) # 51.5
print(lon) # -0.1Im Kapitel Tuples entpacken wird dieses Muster ausführlicher behandelt.
Stern-Zuweisung (erweitertes Unpacking)
Wenn die Anzahl der Elemente in einem Iterable unbekannt ist, kann einem Namen das Präfix * vorangestellt werden, um die verbleibenden Elemente in einer Liste zu sammeln:
first, *rest = [10, 20, 30, 40]
print(first) # 10
print(rest) # [20, 30, 40]Der mit Stern versehene Name kann an beliebiger Stelle in der Zielliste stehen — am Anfang, in der Mitte oder am Ende:
first, *middle, last = [10, 20, 30, 40]
print(first) # 10
print(middle) # [20, 30]
print(last) # 40*head, second_last, last = range(1, 6)
print(head) # [1, 2, 3]
print(second_last) # 4
print(last) # 5Regeln für die Stern-Zuweisung:
- Pro Anweisung ist nur ein mit Stern versehener Name erlaubt.
- Der mit Stern versehene Name sammelt immer eine
list, auch wenn null oder ein Element übereinstimmt. - Alle Namen ohne Stern müssen genau einem Element entsprechen.
Wann welches Muster verwenden
| Muster | Typischer Anwendungsfall |
|---|---|
a, b = 1, 2 | Mehrere Werte aus einer Funktion zurückgeben; zwei Variablen tauschen |
x = y = z = 0 | Eine Gruppe von Zählern oder Flags mit demselben Wert initialisieren |
a, b, c = my_list | Eine Sequenz fester Länge in aussagekräftige Namen entpacken |
first, *rest = items | Kopf von Schwanz in einer Liste unbekannter Länge trennen |
Verwandte Themen
- Python-Variablen — wie Variablen funktionieren und Benennungsregeln
- Variablennamen — Benennungskonventionen (snake_case, Schlüsselwörter)
- Tuples entpacken — ausführliche Behandlung des Tuple-Unpackings
- Python-Listen — Listen-Grundlagen, auf die in den Beispielen verwiesen wird
- Globale Variablen — Geltungsbereich und das Schlüsselwort
global