Assegnare Più Valori
Come assegnare più valori in Python: unpacking di tuple, un valore a più variabili, starred assignment ed errori comuni con esempi.
Assegnare più valori in Python
Python consente di assegnare valori a più variabili in una singola istruzione. Questa guida tratta quattro pattern comuni che incontrerai nel codice reale:
- Assegnamento multiplo — valori diversi a variabili diverse in una sola riga.
- Assegnamento a catena — lo stesso valore a più variabili contemporaneamente.
- Unpacking di iterabili — estrarre elementi da una lista, una tupla o qualsiasi iterabile.
- Starred assignment — raccogliere un "resto" di lunghezza variabile in una lista.
Ogni pattern è spiegato di seguito con esempi eseguibili e gli errori a cui prestare attenzione.
Assegnamento multiplo (Tuple Unpacking)
La forma più comune utilizza un elenco di nomi separati da virgola a sinistra e un corrispondente elenco di valori a destra:
variable1, variable2, variable3 = value1, value2, value3Python impacchetta il lato destro in una tupla temporanea e poi la spacchetta nei nomi a sinistra, da sinistra a destra. Il numero di nomi e di valori deve corrispondere esattamente; in caso contrario, Python genera un ValueError.
Assegnamento di tre variabili di tipi diversi in una sola riga:
Output:
Python
3.7
TrueQuesto equivale a scrivere tre istruzioni di assegnamento separate, ma è più conciso e rende evidente a colpo d'occhio la relazione tra i nomi.
Scambiare variabili
Poiché Python valuta l'intero lato destro prima di effettuare qualsiasi assegnamento, è possibile scambiare due variabili senza una variabile temporanea:
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)Output:
Before swapping
x = 5
y = 10
After swapping
x = 10
y = 5Nella maggior parte degli altri linguaggi questo scambio richiede una terza variabile temporanea. La semantica di impacchettamento delle tuple in Python rende sicura la versione su una riga.
ValueError: numero di elementi non corrispondente
Se il numero di valori non corrisponde al numero di nomi, Python genera immediatamente un ValueError:
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)Quando vedi questo errore, conta i nomi a sinistra e i valori a destra — devono essere uguali, altrimenti è necessario lo starred assignment (vedi sotto).
Assegnamento a catena (un valore, più variabili)
Per assegnare a più variabili lo stesso valore iniziale, concatena gli operatori di assegnamento:
x = y = z = 0
print(x, y, z)Output:
0 0 0Python valuta 0 una sola volta e lega tutti e tre i nomi allo stesso object. Questo funziona correttamente con object immutabili (interi, string, tuple). Attenzione ai valori predefiniti mutabili — tutti e tre i nomi puntano allo stesso object lista:
# Pitfall: shared mutable object
a = b = c = []
a.append(1)
print(b) # [1] — b is the same list, not a copy!Se hai bisogno di liste indipendenti, usa una list comprehension o assegnamenti separati:
a, b, c = [], [], []Unpacking di un iterabile
Puoi spacchettare qualsiasi iterabile — una lista, una tupla, una string, un range o altro — direttamente nelle variabili:
a, b, c = [10, 20, 30]
print(a, b, c)Output:
10 20 30Questo è lo stesso meccanismo dell'assegnamento multiplo; Python non distingue se il lato destro è una tupla letterale o una variabile lista. Ad esempio, lo spacchettamento di una tupla funziona in modo identico:
coords = (51.5, -0.1)
lat, lon = coords
print(lat) # 51.5
print(lon) # -0.1Vedi il capitolo Unpack Tuples per un approfondimento su questo pattern.
Starred assignment (Extended Unpacking)
Quando non sai quanti elementi contiene un iterabile, aggiungi * prima di un nome per raccogliere gli elementi rimanenti in una lista:
first, *rest = [10, 20, 30, 40]
print(first) # 10
print(rest) # [20, 30, 40]Il nome con l'asterisco può comparire in qualsiasi posizione nell'elenco dei target — all'inizio, al centro o alla fine:
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) # 5Regole per lo starred assignment:
- È consentito un solo nome con asterisco per istruzione.
- Il nome con asterisco raccoglie sempre una
list, anche quando corrisponde a zero o un elemento. - Tutti i nomi senza asterisco devono corrispondere esattamente a un elemento.
Quando usare ogni pattern
| Pattern | Caso d'uso tipico |
|---|---|
a, b = 1, 2 | Restituire più valori da una funzione; scambiare due variabili |
x = y = z = 0 | Inizializzare un gruppo di contatori o flag allo stesso valore |
a, b, c = my_list | Spacchettare una sequenza di lunghezza fissa in nomi significativi |
first, *rest = items | Separare la testa dalla coda in una lista di lunghezza sconosciuta |
Argomenti correlati
- Python Variables — come funzionano le variabili e le regole di denominazione
- Variable Names — convenzioni di denominazione (snake_case, parole chiave)
- Unpack Tuples — trattazione dettagliata dell'unpacking di tuple
- Python Lists — fondamenti delle liste citati negli esempi precedenti
- Global Variables — scope e la parola chiave
global