2.8. Tuples

Ein Tupel ist eine unveränderliche, geordnete Folge von Werten. Nach dem Erstellen können die darin enthaltenen Elemente nicht hinzugefügt, entfernt oder geändert werden.

2.8.1. Tupel erstellen

Verwenden Sie runde Klammern (oder einfach Kommas), um ein Tupel zu erstellen:

empty   = ()
point   = (3, 4)
triple  = 1, 2, 3                # parentheses are optional
mixed   = (1, "two", 3.14)
nested  = ((1, 2), (3, 4))

2.8.1.1. Der Fallstrick mit einem einzelnen Element

Klammern um einen Wert sind nur Klammern; was ein Tupel tatsächlich ausmacht, ist das Komma. Ein einelementiges Tupel benötigt ein nachgestelltes Komma:

>>> (1)
1                                # just an int in parens
>>> (1,)
(1,)                             # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)

2.8.2. Länge, Indizierung und Slicing

Genau wie bei Listen und Strings – len(), Indizierung, Slicing, in und + / * funktionieren alle auf dieselbe Weise:

>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)

2.8.3. Unveränderlichkeit

Tupel haben kein append, pop, sort oder eine andere Methode, die an Ort und Stelle arbeitet. Eine indizierte Zuweisung löst TypeError aus:

>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment

Um ein Tupel zu „ändern“, erstellen Sie ein neues mit den geänderten Werten.

2.8.4. Entpacken

Die Hauptsuperkraft eines Tupels ist das Entpacken: jedes Element wird in einer einzigen Anweisung einer separaten Variablen zugewiesen.

Ein dreielementiges Tupel (1, 2, 3), das in drei benannte Variablen x, y, z entpackt wird.

Das Entpacken bindet jedes Element eines Tupels in einer einzigen Zuweisung an eine benannte Variable.

>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4

Die rechte Seite kann jedes Iterable sein – eine Liste, ein String, der Rückgabewert einer Funktion:

>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')

Ein führendes * sammelt „den Rest“ eines Entpackens in einer Liste:

>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]

2.8.5. Mehrere Rückgabewerte

Eine Funktion kann ein Tupel zurückgeben, um mehrere Werte auf einmal zu liefern; der Aufrufer entpackt sie beim Empfang:

def size_of(rect):
    return (rect[2] - rect[0], rect[3] - rect[1])

width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120

Die Klammern beim return sind optional – ein bloßes return a, b ist ebenfalls ein Tupel.

2.8.6. Tupel vs. Liste

Ein praktischer Leitfaden, zu welchem man greifen sollte:

  • Tupel für Daten mit fester Form, oft heterogen: (x, y)-Punkte, (r, g, b)-Farben, mehrere Rückgabewerte, für die spätere Verwendung gepackte Funktionsargumente.

  • Liste für Daten variabler Länge, oft homogen: eine Liste von Messwerten, eine Warteschlange zu verarbeitender Elemente, alles, woran Sie etwas anzuhängen erwarten.

Tupel sind außerdem hashbar (solange jedes darin enthaltene Element hashbar ist), sodass sie als Schlüssel in einem dict verwendet werden können.