[Python] Creazione lista..

Daniele Varrazzo piro a develer.com
Mer 20 Gen 2010 18:22:11 CET


On Wed, 20 Jan 2010 18:13:37 +0100, Antonio Penta
<penta.antonio a gmail.com>
wrote:
> Salve ho un dubbio..
> 
> se creo una lista di n dizionari
> 
> in questo modo
> 
> n=4
> l=[{}]*n
> 
> ed poi voglio agire all'interno della lista
> 
> in questo modo
> 
> l[index][key]=3
> 
> dove index è un indice e key è una chiave
> 
> ho visto che il risultato è
> 
> [{key:4},{key:4},{key:4},{key:4},]
> 
> praticamente mi aggiorna tutti i dizionari all'interno della lista con
la
> chiave data.
> 
> invece
> 
> se creo la lista in questo modo
> 
> l=[]
> for item in xrange(n)
>       l.append({});
> 
> e faccio
> 
> l[index][key]=3
> 
> ho visto che il risultato è
> 
> [{key:4},{},{},{},]
> 
> 
> quindi nel primo caso è come se rimanesse un iteratore di default sulla
> lista ?? E' un comportamento normale..


Con [{}]*n hai costruito un solo dizionario, hai aggiunto il riferimento
di questo dizionario ad una lista e poi hai moltiplicato _il riferimento_.
Con il loop esplicito invece hai creato un nuovo dizionario ad ogni
iterazione. Puoi usare la funzione id() per verificare che nel primo
esempio tutti gli elementi della lista puntano allo stesso oggetto in
memoria.

Sì, è un comportamento normale: è un po' come se avessi fatto una "shallow
copy": hai ottenuto copie dei puntatori allo stesso oggetto, non copie
dell'oggetto vero.

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python