Questa è una risposta non alla domanda originale (a cui penso sia stata data una risposta adeguata), ma alle numerose domande che sono state poste nei commenti sulla semantica di assegnazione aumentata (+=
e operazioni simili).
In breve: l'assegnazione aumentata funziona in modo diverso per i tipi mutabili rispetto a quelli immutabili.
str
, tuple
e i tipi numerici, tra gli altri, sono immutabili. Il contenuto di una tupla non possono essere modificati una volta che è stato creato, in modo da ottenere questo comportamento:
>>> a = (1, 2)
>>> b = a
>>> a += (3, 4)
>>> a
(1, 2, 3, 4)
>>> b
(1, 2)
str
ha la stessa semantica. Fondamentalmente, a += b
equivale a a = a + b
se a
è immutabile.
La maggior parte degli altri tipi, incluso list
, è modificabile.Il contenuto di una lista può essere modificato e l'assegnazione aumentata fa esattamente questo. Quindi:
>>> a = [1, 2]
>>> b = a
>>> a += [3, 4]
>>> a
[1, 2, 3, 4]
>>> b
[1, 2, 3, 4]
Mentre se la terza linea sono stati sostituiti con a = a + [3, 4]
, una nuova lista verrebbe creata e b
sarebbe [1, 2]
.
Per una classe definita dall'utente, la semantica dipendono da come è stato implementato, ma questo è il modo in cui dovrebbe essere fatto per PEP 203.
È questo comportamento ancora presenti in Python 3.x? Ho sempre trovato irritante il fatto che un tipo di libreria standard infrange il contratto generale che 'a + = b' <=>' a = a + b' (senza influire su altri riferimenti al valore originale 'a'). –
@Karl Knechtel: sfortunatamente, è ancora presente in Python 3.2.1. –
Lo stavo verificando in python 3.2, sì. Ho trovato il problema guardando un codice principiante che stava producendo risultati sbagliati. Non ho trovato alcun riferimento a questo comportamento specifico in 'Learning Python'. Ho controllato PEP203 e si dice che '__iadd__' è usato ma dicono anche che' __iadd__' è l'inplace '__add__' che non è il caso in questo caso ... Forse qualcuno potrebbe spiegare il razionale sotto questo comportamento o punto/collegamento ad alcune discussioni a riguardo? Capisco dal commento di Karl che ci sono persone a riguardo – joaquin