Python, è un bug, aggiungere a una lista all'interno di una tupla risultati in Nessuno?[duplicato]
-
09-12-2019 - |
Domanda
Questo è uno degli esempi più brevi che ho scritto da molto tempo
Creo e aggiorno un tuple3
In [65]: arf=(0,1,[1,2,3])
In [66]: arf=(arf[0],arf[1], arf[2] )
In [67]: arf
Out[67]: (0, 1, [1, 2, 3])
Quindi la riassegnazione ha funzionato.
Ora cerco di cambiare il suo contenuto.
In [69]: arf=(arf[0],arf[1], [2] )
In [70]: arf
Out[70]: (0, 1, [2])
In [71]: arf=(arf[0],arf[1], arf[2].append(3) )
In [72]: arf
Out[72]: (0, 1, None)
Non ne riavro ' Nessuno???Ehi, cosa dà?Scusa, sono un pitone noob.
Soluzione
list.append()
ritorna sempre None
cosi arf[2].append(3)
aggiungerà 3
per arf
e ritorno None
non si arriva mai a vedere questo cambiamento per arf[2]
perché si sta immediatamente rebinding arf
alla tupla appena creata
Forse è questo che vuoi
arf = (arf[0], arf[1], arf[2]+[3])
Altri suggerimenti
Il list.append
metodo cambia l'elenco in atto e restituisce None
.Questo non è un bug, questo è solo il modo in cui il append
il metodo funziona.
append
non restituisce la nuova lista, modifica quella vecchia sul posto:
>>> a = [1, 2, 3]
>>> b = a.append(4)
>>> print b
None
>>> print a
[1, 2, 3, 4]
Per approfondire la risposta di gnibbler, list.append () cambia la lista stessa, ma non restituisce il nuovo valore della lista.Ritorna None
.Quindi il tuo comando 71 cambia il valore di arf[2] nel modo desiderato, ma poi ritorna immediatamente None
e imposta arf [2] a quello.
L'auto-riferimento nel tuo esempio offusca un po ' le cose, ma se provi un comando come someothervariable=arf[2].append(3)
, vedrai come funziona. someothervariable
è impostato su None
e arf [2] ha aggiunto 3 senza un'istruzione di assegnazione esplicita.