python: aggiungere un dizionario a un elenco - vedo un comportamento simile a un puntatore


88

Ho provato quanto segue nell'interprete Python:

>>>
>>> a = []
>>> b = {1:'one'}
>>> a.append(b)
>>> a
[{1: 'one'}]
>>> b[1] = 'ONE'
>>> a
[{1: 'ONE'}]
>>>

Qui, dopo aver aggiunto il dizionario "b" alla lista "a", modifico il valore corrispondente alla chiave 1 nel dizionario "a". In qualche modo questo cambiamento si riflette anche nella lista. Quando aggiungo un dizionario a un elenco, non sto semplicemente aggiungendo il valore di dizionario? Sembra che abbia aggiunto un puntatore al dizionario all'elenco e quindi anche le modifiche al dizionario si riflettono nell'elenco.

Non voglio che la modifica si rifletta nell'elenco. Come lo faccio?

Grazie per il tuo tempo!


Cechov Non è dizionario "b" , ma dizionario b o dizionario di nome "b" . A proposito, hai scritto per errore: "Sto cambiando il valore corrispondente alla chiave 1 nel dizionario 'a'" No, nel dizionario b. Per quanto riguarda il tuo stupore: una lista non contiene valori, contiene oggetti, poiché tutto è oggetto in Python. O più esattamente una lista contiene i riferimenti agli oggetti.
eyquem

Cechov Si dovrebbe anche vedere questa domanda: ( stackoverflow.com/questions/5242933/... )
Eyquem

@eyquem grazie per il tuo commento. Lo stavo postando in fretta. Mie scuse.
neo29

Cechov Non era un rimprovero, era solo un'informazione. A proposito, se la mia risposta è in qualche modo utile, può essere votata. Inoltre, puoi scegliere di "accettare" una risposta tra le risposte, facendo clic sulla striscia a forma di chevron sotto il contatore dei punti a sinistra di una risposta, guadagnerai 25 punti. Oppure puoi scegliere di non accettare nessuna domanda.
eyquem

Risposte:


145

Hai ragione in quanto la tua lista contiene un riferimento al dizionario originale.

a.append(b.copy()) dovrebbe fare il trucco.

Tieni presente che questo fa una copia superficiale. Un'alternativa è usare copy.deepcopy(b), che fa una copia profonda.


6
eccezionale! Sono stato bloccato per molto tempo su questo
Yasin

2
questo mi ha sconvolto per circa mezz'ora fino a quando ho rinunciato e ho deciso di controllare lo stack.
FlyingZebra1

35

Anche con dict

a = []
b = {1:'one'}

a.append(dict(b))
print a
b[1]='iuqsdgf'
print a

risultato

[{1: 'one'}]
[{1: 'one'}]

Non sono sicuro che sia abbastanza veloce come copy (), ma sembra essere più veloce di deepcopy (). Forse con un complicato schema di dizionario sarà vicino a deepcopy () perché dict () crea un nuovo dizionario.
selotec

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.