Le istruzioni di assegnamento vengono usate per (ri)legare nomi a valori e modificare attributi o elementi di oggetti mutabili:
assignment_stmt |
::= | (target_list "=")+ expression_list |
target_list |
::= | target ("," target)* [","] |
target |
::= | identifier |
| "(" target_list ")" | ||
| "[" target_list "]" | ||
| attributeref | ||
| subscription | ||
| slicing |
(Vedere la sezione 5.3 per la definizione della sintassi degli ultimi tre simboli.)
Un'istruzione di assegnamento valuta la lista delle espressioni (ricordando che questa può essere una singola espressione o una lista separata da virgole, l'ultima produce una tupla) e assegna ogni singolo oggetto risultante ad ognuno dei riferimenti forniti, da sinistra a destra.
L'assegnamento viene determinato ricorsivamente a seconda della forma del riferimento (lista). Quando un riferimento fa parte di un oggetto mutabile (un riferimento ad un attributo, una subscription o a fette), l'oggetto mutabile deve infine eseguire l'assegnamento e decidere la propria validità e può sollevare un'eccezione se l'assegnamento è inaccettabile. Le regole osservate dai vari tipi ed eccezioni sollevate vengono date con la definizione del tipo di oggetto (vedere la sezione 3.2).
L'assegnamento di un oggetto ad una lista di riferimenti viene definita ricorsivamente come segue.
L'assegnamento di un oggetto ad un singolo riferimento viene ricorsivamente definito come segue.
Se il nome era già legato viene legato nuovamente. Questo può causare il raggiungimento di zero da parte del contatore di riferimenti per l'oggetto precedentemente legato al nome, causando la disallocazione dell'oggetto e la chiamata al suo distruttore (se esiste).
Se la primaria è una sequenza mutabile (per esempio una lista), il subscript deve produrre un intero. Se è negativo deve essere un intero non negativo, minore della lunghezza della sequenza e la sequenza assegna l'oggetto assegnato agli elementi con il dato indice. Se l'indice è fuori intervallo, viene sollevata un'eccezione IndexError (l'assegnamento ad una sequenza non può aggiungere nuovi elementi alla lista).
Se la primaria è un oggetto mappabile (per esempio un dizionario), il subscript deve avere un tipo compatibile con il tipo chiave della mappa e la mappa deve creare una coppia chiave/valore che mappa il subscript all'oggetto assegnato (se non esiste una chiave con lo stesso valore).
(Nell'implementazione corrente, la sintassi per gli identificativi diviene la stessa che per le espressioni e sintassi individuali vengono rifiutate durante la fase di generazione del codice, causando messaggi di errore dettagliati.)
AVVERTENZE: benché la definizione di assegnamento implichi che sovrapposizioni tra la parte sinistra e destra siano `innocue' (per esempio, "a, b = b, a" scambia le due variabili), sovrapposizioni all'interno della collezione di variabili assegnate non sono sicure! Per esempio, il seguente programma visualizza "[0, 2]":
x = [0, 1] i = 0 i, x[i] = 1, 2 print x