W3docs

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:

  1. Assegnamento multiplo — valori diversi a variabili diverse in una sola riga.
  2. Assegnamento a catena — lo stesso valore a più variabili contemporaneamente.
  3. Unpacking di iterabili — estrarre elementi da una lista, una tupla o qualsiasi iterabile.
  4. 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, value3

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

python— editable, runs on the server

Output:

Python
3.7
True

Questo 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 = 5

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

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

Questo è 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.1

Vedi 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)         # 5

Regole 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

PatternCaso d'uso tipico
a, b = 1, 2Restituire più valori da una funzione; scambiare due variabili
x = y = z = 0Inizializzare un gruppo di contatori o flag allo stesso valore
a, b, c = my_listSpacchettare una sequenza di lunghezza fissa in nomi significativi
first, *rest = itemsSeparare la testa dalla coda in una lista di lunghezza sconosciuta

Argomenti correlati

Esercitazione

Pratica
Which of the following are valid ways to assign multiple values in Python?
Which of the following are valid ways to assign multiple values in Python?
Was this page helpful?