6.3.1 Dichiarazioni di assegnamento incrementale

L'assegnamento incrementale č la combinazione, in una singola istruzione, di un'operazione binaria e un'istruzione di assegnamento:

augmented_assignment_stmt  ::=  target augop expression_list
augop  ::=  "+=" | "-=" | "*=" | "/=" | "%=" | "**="
    | "»=" | "«=" | "&=" | "^=" | "|="
Potete scaricare il file originale (in Inglese) come testo.

(Vedere la sezione 5.3 per la definizione della sintassi per gli ultimi tre assegnamenti.)

Un assegnamento incrementale valuta l'obiettivo (che, a differenza delle normali istruzioni di assegnamento, non puņ essere un parametro unpacking) e l'espressione, esegue l'operazione binaria specifica per il tipo di operazione dei due operandi e assegna il risultato all'obiettivo originale. L'obiettivo viene valutato una sola volta.

Un'espressione di assegnamento incrementale come x += 1 puņ essere riscritto come x = x + 1 per ottenere la stessa cosa, ma non esattamente lo stesso effetto. Nella versione incrementale, x viene valutata solamente una volta. Inoltre, quando possibile, l'operazione viene eseguita sul posto, il che significa che invece di creare un nuovo oggetto e assegnarlo all'obiettivo, viene modificato il vecchio oggetto.

Con l'eccezione dell'assegnamento di tuple ed obiettivi multipli in una singola dichiarazione, l'assegnamento fatto attraverso una dichiarazione incrementale viene gestito nello stesso modo di un normale assegnamento. In modo simile, con l'eccezione del possibile comportamento sul posto, l'operazione binaria viene eseguita nello stesso modo di una normale operazione binaria.

Per obiettivi che sono riferimenti ad attributi, il valore iniziale viene ottenuto con getattr() ed il risultato viene assegnato con setattr(). Da notare che i due metodi non si riferiscono necessariamente alla stessa variabile. Quando getattr() fa riferimento ad una variabile di classe, setattr() si riferisce ancora ad una variabile istanza. Per esempio:

class A:
    x = 3    # variabile di classe
a = A()
a.x += 1     # scrive a.x come 4 lasciando A.x come 3

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.