2.8. Tuples

En tupel är en oföränderlig, ordnad följd av värden. När den väl har skapats kan elementen inuti inte läggas till, tas bort eller ändras.

2.8.1. Skapa tupler

Använd parenteser (eller bara kommatecken) för att skapa en tupel:

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. Fallgropen med ett enda element

Parenteser runt ett värde är bara parenteser; det som faktiskt gör en tupel är kommatecknet. En tupel med ett element behöver ett avslutande kommatecken:

>>> (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ängd, indexering och slicing

Samma som för listor och strängar – len(), indexering, slicing, in och + / * fungerar alla på samma sätt:

>>> 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. Oföränderlighet

Tupler har inte append, pop, sort eller någon annan metod som verkar på plats. Indexerad tilldelning utlöser TypeError:

>>> 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

För att ”ändra” en tupel bygger du en ny med de ändrade värdena.

2.8.4. Uppackning

En tupels främsta superkraft är uppackning: att tilldela varje element till en separat variabel i en enda sats.

En tupel med tre element (1, 2, 3) som packas upp i tre namngivna variabler x, y, z.

Uppackning binder varje element i en tupel till en namngiven variabel i en enda tilldelning.

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

Högersidan kan vara valfri itererbar – en lista, en sträng, returvärdet från en funktion:

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

Ett inledande * samlar ”resten” av en uppackning i en lista:

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

2.8.5. Flera returvärden

En funktion kan returnera en tupel för att leverera flera värden på en gång; anroparen packar upp dem på vägen in:

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

Parenteserna kring return är valfria – ett naket return a, b är också en tupel.

2.8.6. Tupel kontra lista

En praktisk vägledning för vilken du ska ta till:

  • Tupel för data med fast form, ofta heterogena: (x, y)-punkter, (r, g, b)-färger, flera returvärden, funktionsargument packade för senare bruk.

  • Lista för data med variabel längd, ofta homogena: en lista med mätningar, en kö med element att behandla, allt du förväntar dig att lägga till i.

Tupler är också hashbara (så länge varje element inuti är hashbart), så de kan användas som nycklar i en dict.