In Python, gli elementi di una tupla o lista possono essere espansi e assegnati a più variabili. Questo è chiamato spacchettamento di sequenza o assegnazione spacchettata.
I seguenti dettagli sono descritti qui.
- Basi di spacchettamento di tuple e liste
- Tuple annidate, elenchi spacchettati
- Disimballaggio con i trattini:
_
- Disimballaggio con asterischi:
*
Vedi il seguente articolo per informazioni sull'uso degli asterischi per espandere e passare tuple, liste e dizionari come argomenti di funzioni.
Basi di spacchettamento di tuple e liste
Quando le variabili sono scritte sul lato sinistro, separate da virgole, ad ogni variabile viene assegnato un elemento della tupla o della lista sul lato destro. È lo stesso sia per le tuple che per le liste (gli esempi seguenti sono scritti in forma di tupla).
t = (0, 1, 2)
a, b, c = t
print(a)
print(b)
print(c)
# 0
# 1
# 2
l = [0, 1, 2]
a, b, c = l
print(a)
print(b)
print(c)
# 0
# 1
# 2
Si noti che poiché le tuple possono omettere le parentesi tonde, questo può essere usato per assegnare valori multipli a variabili multiple su una singola linea come segue.
a, b = 0, 1
print(a)
print(b)
# 0
# 1
Se il numero di variabili non corrisponde al numero di elementi, si verifica un errore.
# a, b = t
# ValueError: too many values to unpack (expected 2)
# a, b, c, d = t
# ValueError: not enough values to unpack (expected 4, got 3)
Se il numero di variabili è inferiore al numero di elementi, gli elementi rimanenti possono essere assegnati come lista aggiungendo un asterisco al nome della variabile (vedi sotto).
Tuple annidate, elenchi spacchettati
Anche le tuple e le liste annidate possono essere scompattate. Se volete decomprimere anche il contenuto, racchiudete la variabile in uno dei seguenti elementi
()
[]
t = (0, 1, (2, 3, 4))
a, b, c = t
print(a)
print(b)
print(c)
# 0
# 1
# (2, 3, 4)
print(type(c))
# <class 'tuple'>
a, b, (c, d, e) = t
print(a)
print(b)
print(c)
print(d)
print(e)
# 0
# 1
# 2
# 3
# 4
Disimballato con _underscore_.
In Python, non solo spacchettati, i valori che non sono necessari sono convenzionalmente assegnati al trattino basso (underscore) _. Non c'è un significato grammaticale speciale; sono semplicemente assegnati ad una variabile chiamata _.
t = (0, 1, 2)
a, b, _ = t
print(a)
print(b)
print(_)
# 0
# 1
# 2
Disimballaggio con asterischi
Se il numero di variabili è inferiore al numero di elementi, un asterisco nel nome della variabile farà sì che gli elementi siano assegnati insieme come una lista.
Questa sintassi è stata implementata da Python 3 e non è disponibile in Python 2.
Gli elementi sono assegnati dall'inizio e dalla fine alle variabili senza asterischi, e gli elementi rimanenti sono assegnati come lista alle variabili con asterischi.
t = (0, 1, 2, 3, 4)
a, b, *c = t
print(a)
print(b)
print(c)
# 0
# 1
# [2, 3, 4]
print(type(c))
# <class 'list'>
a, *b, c = t
print(a)
print(b)
print(c)
# 0
# [1, 2, 3]
# 4
*a, b, c = t
print(a)
print(b)
print(c)
# [0, 1, 2]
# 3
# 4
Per esempio, se volete assegnare solo i primi due elementi di una tupla o di una lista a una variabile, potreste usare l'underscore per le parti che non sono necessarie.
a, b, *_ = t
print(a)
print(b)
print(_)
# 0
# 1
# [2, 3, 4]
Lo stesso può anche essere scritto come segue
a, b = t[0], t[1]
print(a)
print(b)
# 0
# 1
Può essere allegato un solo asterisco. Se ci sono più variabili marcate con un asterisco, risulterà un errore SyntaxError perché non è possibile determinare quanti elementi sono assegnati a ciascuna variabile.
# *a, b, *c = t
# SyntaxError: two starred expressions in assignment
Notate che anche un singolo elemento assegnato a una variabile contrassegnata da un asterisco è assegnato come lista.
t = (0, 1, 2)
a, b, *c = t
print(a)
print(b)
print(c)
# 0
# 1
# [2]
print(type(c))
# <class 'list'>
Se non ci sono elementi extra, viene assegnata una lista vuota.
a, b, c, *d = t
print(a)
print(b)
print(c)
print(d)
# 0
# 1
# 2
# []