2.8. Tuple

Una tupla è una sequenza ordinata e immutabile di valori. Una volta creata, gli elementi al suo interno non possono essere aggiunti, rimossi o modificati.

2.8.1. Creare tuple

Usa le parentesi tonde (o semplicemente le virgole) per creare una tupla:

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. Il tranello dell’elemento singolo

Le parentesi tonde attorno a un valore sono solo parentesi; ciò che effettivamente crea una tupla è la virgola. Una tupla di un solo elemento ha bisogno di una virgola finale:

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

2.8.2. Lunghezza, indicizzazione e slicing

Come per le liste e le stringhe – len(), indicizzazione, slicing, in e + / * funzionano tutti allo stesso modo:

>>> 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. Immutabilità

Le tuple non hanno append, pop, sort o qualsiasi altro metodo in posizione. L’assegnazione tramite indice solleva 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

Per «modificare» una tupla, costruiscine una nuova con i valori cambiati.

2.8.4. Spacchettamento

Il superpotere principale di una tupla è lo spacchettamento: assegnare ciascun elemento a una variabile separata in un’unica istruzione.

Una tupla di tre elementi (1, 2, 3) spacchettata in tre variabili denominate x, y, z.

Lo spacchettamento lega ciascun elemento di una tupla a una variabile denominata in un’unica assegnazione.

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

Il lato destro può essere qualsiasi iterabile – una lista, una stringa, il valore restituito di una funzione:

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

Un * iniziale raccoglie «il resto» di uno spacchettamento in una lista:

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

2.8.5. Valori di ritorno multipli

Una funzione può restituire una tupla per consegnare più valori in una volta sola; il chiamante li spacchetta al momento dell’ingresso:

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

Le parentesi sul return sono opzionali – anche un semplice return a, b è una tupla.

2.8.6. Tupla vs lista

Una guida pratica per capire a quale ricorrere:

  • Tupla per dati di forma fissa, spesso eterogenei: punti (x, y), colori (r, g, b), valori di ritorno multipli, argomenti di funzione impacchettati per un uso successivo.

  • Lista per dati di lunghezza variabile, spesso omogenei: una lista di misurazioni, una coda di elementi da elaborare, qualsiasi cosa a cui prevedi di aggiungere in coda.

Le tuple sono anche hashable (purché ogni elemento al loro interno sia hashable), quindi possono essere usate come chiavi in un dict.