[Python] Dizionario modificato.

AlberTo De Prezzo armitage a programmer.net
Ven 5 Set 2014 17:50:10 CEST


Il giorno 05 settembre 2014 10:18, Walter Valenti <waltervalenti a yahoo.it>
ha scritto:

> Prendiamo questo semplice codice:
>
>
> def list():
>     elem = dict()
>     lista = []
>     for x in range(3):
>         elem['nome'] = x
>         lista.append(elem)
>     print lista
> list()
>
> Mi aspetterei come output:
> [{'nome': 0}, {'nome': 1}, {'nome': 2}]
> Quello che ottengo è invece:
> [{'nome': 2}, {'nome': 2}, {'nome': 2}]
>

imho quello che ti spiazza è il comportamento dell'append(), perchè ti
aspetti che all'interno del ciclo for,
l'append gestisca il *valore*, mentre in realta' gestisce le referenze. Mi
spiego meglio: quando usi l'append() tu
non fai altro che prendere una referenza al valore di elem ed assegnarla in
coda alla list lista.
Facendo in questo modo, ad ogni ciclo, al sovrascrivere del valore di elem,
variano tutte le sue referenze,
ed è per questo motivo che -a fine ciclo- ti ritrovi [{'nome': 2}, {'nome':
2}, {'nome': 2}], cioè il valore *finale* di elem, cui puntano
tutte le referenze appese in precedenza.

A tal proposito, guarda il comportamento del seguente codice:

def list():
    elem = dict()
    lista = []
    for x in range(3):
        elem['nome'] = x
        copia_shallow = elem.copy()
        lista.append(copia_shallow)
    print(lista)
list()

risultato:
[{'nome': 0}, {'nome': 1}, {'nome': 2}]

ciao
Alberto De Prezzo
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20140905/3a845cd6/attachment-0001.html>


Maggiori informazioni sulla lista Python