2014-04-30 16 views
10

Il problemaAppend valore da una lista in dizionario aggiunge valore a tutte le liste in dizionario

Sto creando un dizionario con liste vuote come valori nel seguente modo.

>>> words = dict.fromkeys(['coach', 'we', 'be'], []) 

Il dizionario ha questo aspetto.

Quando aggiungo un valore a una lista, il valore viene aggiunto a tutti come in questo esempio.

>>> words['coach'].append('test') 
{'coach': ['test'], 'be': ['test'], 'we': ['test']} 

La questione

La mia domanda ha due parti. Primo, perché sta succedendo questo? Secondo, cosa posso fare a riguardo? Cioè, come posso aggiungere un valore a una sola lista?

Immagino che nella creazione del dizionario, ho fatto tutte le liste puntare allo stesso oggetto. Ma non capisco come possa essere perché quando inserisco 0 invece di [] nella creazione di dizionari e poi aggiungo valori invece di aggiungerli, i valori si comportano diversamente come se puntassero a oggetti distinti.

Apprezzerei qualsiasi input. Grazie in anticipo!

risposta

18

dict.fromkeys utilizza lo stesso oggettoper tutti i valori, in questo caso una lista mutable ... Ciò significa che, tutti i tasti condividono la stessa lista vuota ... Quando si tenta di .append al valore di una sola lista , le modifiche sono apportate sul posto all'oggetto, quindi le modifiche ad esso sono visibili da tutti quelli che fanno riferimento ad esso.

Se invece è stato utilizzato un dict-comp, ad esempio: {k:[] for k in ['could', 'we', 'be']} ogni [] è un diverso lista vuota e così sarebbe stato unico per ogni valore della chiave e il lavoro come previsto.

Riguardo all'utilizzo dict.fromkeys(['a', 'b', 'c'], 0) il 0 è un immutabile oggetto quindi non è soggetta a tale Gotcha come modifiche che comportano nuovi oggetti, non un cambiamento all'oggetto sottostante che diversi nomi (in questo caso - la valori delle diverse chiavi) possono condividere.

Problemi correlati