Trovato la risposta su IRC.
t[0] += [1]
è una serie di azioni discrete:
- carico
t[0]
- costruzione di un nuovo elenco con
1
in esso
- aggiungendo che
[1]
a qualunque t[0]
è
- riassegnazione
t[0]
Sembra che x += y
è fondamentalmente x = x + y
(ma, è vero?)
La parte difficile è che +=
implica l'assegnazione sia al tuple t
e all'elenco t[0]
t[0] += [1]
non è letteralmentet[0] = t[0] + [1]
, è è: t[0] = t[0].__iadd__([1])
Ciò che accade è:
__iadd__
entrambi mutano la lista e la restituiscono. Quindi l'elenco (che è il primo elemento in t
) ha già aggiunto 1
ad esso.
- La mutazione della tupla viene tentata anche sul posto, ma le tuple sono immutabili, risultando nell'eccezione.
Perché non è visibile in bella vista? Perché un n00b come me si aspetterebbe che t[0] += [1]
riescano tutti insieme o falliscano, perché è una linea corta di python. Ma non è sempre così.
fonte
2016-07-13 06:36:22
[Perché a_tuple [i] + = ['elemento'] 'genera un'eccezione quando l'aggiunta funziona] (https://docs.python.org/2/faq/programming.html#why-does- a-tuple-i-item-raise-an-exception-when-the-addition-works) –