2013-09-22 10 views
6

Ho una lista di List dire mysolution:La modifica di un elemento in una lista modifica più elenchi ...?

>>>mySolution 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
>>> mySolution[0][0] = 1  
>>> mySolution 
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]] 

uscita previsto:

[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 

Perché è che tutti gli elementi 1a nella mia lista di lista di sta cambiando a 1? Vorrei solo modificare il primo elemento del primo elenco su 1.

+4

Oh quel fastidioso operatore 'n * list'! Sinceramente non mi dispiacerebbe se lanciasse un'eccezione quando sono stati rilevati tipi mutevoli .. – user2246674

risposta

8

Ciò che importa è come è stato creato l'elenco originale mysolution. A quanto pare, contiene quattro volte la stessa lista ed è per questo che cambiarlo una volta lo farà cambiare in tutte e quattro le posizioni.

Per inizializzare le liste zero pieni indipendenti del genere, è possibile effettuare le seguenti operazioni:

mysolution = [[0] * 4 for i in range(4)] 
+0

mySolution = [0] * 4 mySolution = [mySolution] * 4 – Pavan

+1

@Pavan: Non funzionerà perché è la stessa lista quattro volte . la soluzione di Poke lo avverte. – flornquake

2

Poiché tutti gli elenchi contenuti sono in realtà lo stesso elenco. Quando si esegue:

l = [0, 0, 0, 0] 
my_solution = [l, l, l] 

Poi, my_solution[0], my_solution[1], e my_solution[2] sono riferimenti allo stesso oggetto (l).

Se si modifica l'elenco in una posizione, cambia ovunque. Questo perché le liste sono mutabili oggetti.

Al contrario, utilizzare più elenchi:

l1 = [0, 0, 0, 0] 
l2 = [0, 0, 0, 0] 
l3 = [0, 0, 0, 0] 
my_solution = [l1, l2, l3] 

che funzionerà come previsto.

2

E 'molto probabile che si è creato l'elenco come questo:

mySolution = [0]*4 
mySolution = [mySolution]*4 

o equivalentemente:

mySolution = [[0]*4]*4 

Uno dei frammenti di cui sopra creerà un elenco con quattro sottoliste che sono c ope di l'esatto, stesso sottolista, quindi qualsiasi modifica su una sottolista si rifletterà sulle altre - sono una e la stessa cosa. La soluzione è quella di creare quattro diversi sottoliste:

mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 

o un po 'più brevi:

mySolution = [[0]*4 for _ in xrange(4)] 
2

si ricorda che questa sta facendo bene:

mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
mySolution[0][0] = 1  
print mySolution 

>>> 
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 

tutto dipende da come hai inizializzato il tuo solution.questo

mySolution = [[0, 0, 0, 0]]*4 
mySolution[0][0] = 1  
print mySolution 

>>> 
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]] 
>>> 

perché qui ogni matrice [0, 0, 0, 0] in mySolution è una copia di inizializzazione campo [0, 0, 0, 0] in [[0, 0, 0, 0]]*4. se cambi il primo elemento del primo array, cambia anche la sua copia.

con questa inizializzazione mySolution = [[0, 0, 0, 0] for x in range(4)] non si copia l'array ma si aggiunge [0,0,0,0] quattro volte, dando il risultato che si aspetta.

Problemi correlati