2010-04-29 11 views
36

Eventuali duplicati:
Unexpected feature in a Python list of listslista 2D ha strana behavor quando si cerca di modificare un singolo valore

, quindi sono relativamente nuovo per Python e sto avendo problemi a lavorare con gli elenchi 2D.

Ecco il mio codice:

data = [[None]*5]*5 
data[0][0] = 'Cell A1' 
print data 

e qui è l'uscita (formattato per migliorare la leggibilità):

[['Cell A1', None, None, None, None], 
['Cell A1', None, None, None, None], 
['Cell A1', None, None, None, None], 
['Cell A1', None, None, None, None], 
['Cell A1', None, None, None, None]] 

Perché ogni riga vengono assegnati il ​​valore?

+4

Oh ragazzi, mi è stato bloccato su questo stesso problema alla schiena nel corso della giornata .. :) – ktdrv

risposta

45

Questo rende una lista con cinque riferimenti alla lista stessa:

data = [[None]*5]*5 

usare qualcosa come questo, invece che crea cinque liste separate:

>>> data = [[None]*5 for _ in range(5)] 

Ora fa quello che ci si aspetta:

>>> data[0][0] = 'Cell A1' 
>>> print data 
[['Cell A1', None, None, None, None], 
[None, None, None, None, None], 
[None, None, None, None, None], 
[None, None, None, None, None], 
[None, None, None, None, None]] 
2

In python ogni variabile è un ob ject, e quindi un riferimento. Per prima cosa hai creato un array di 5 Nones e poi hai creato un array con 5 volte lo stesso oggetto.

8

Come il python library reference for sequence types, che comprende gli elenchi, dice

Si noti inoltre che le copie sono poco profonde; le strutture nidificate non vengono copiate. Questo spesso tormenta i nuovi programmatori Python; Consideriamo:

>>> lists = [[]] * 3 
>>> lists 
    [[], [], []] 
>>> lists[0].append(3) 
>>> lists 
    [[3], [3], [3]] 

Ciò che è accaduto è che [[]] è una lista di un elemento che contiene un elenco vuoto, in modo da tutti e tre gli elementi di [[]] * 3 sono (puntatori a) questo singola lista vuota. La modifica di uno qualsiasi degli elementi degli elenchi modifica questa singola lista.

È possibile creare una lista di diverse liste in questo modo:

>>> lists = [[] for i in range(3)] 
>>> lists[0].append(3) 
>>> lists[1].append(5) 
>>> lists[2].append(7) 
>>> lists 
    [[3], [5], [7]] 
Problemi correlati