2013-09-22 17 views
6

Ich habe eine Liste der Liste mysolution sagen:Ändern eines Elements in einer Liste ändert mehrere Listen ..?

>>>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]] 

Vorgesehen Ausgabe:

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

warum ist es, dass alle ersten Elemente in meiner Liste der Liste der auf 1 geändert werden? Ich möchte nur das erste Element der ersten Liste in 1 ändern.

+4

Oh, das lästige 'n * liste'-Operator! Ich würde ehrlich nichts dagegen, wenn es eine Ausnahme ausgelöst, wenn wandelbar Arten nachgewiesen .. – user2246674

Antwort

8

Was zählt ist, wie Sie Ihre ursprüngliche mysolution Liste erstellt haben. Wie es scheint, enthält es vier Mal die gleiche Liste, weshalb die Änderung es an allen vier Orten ändern wird.

Um unabhängig Null gefüllten Listen so zu initialisieren, können Sie Folgendes tun:

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

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

+1

@Pavan: Das wird nicht funktionieren, weil es die gleiche Liste viermal ist . Pokes Lösung sieht so aus. – flornquake

2

Da alle enthaltenen Listen tatsächlich die gleiche Liste sind. Wenn Sie das tun:

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

Dann my_solution[0], my_solution[1] und my_solution[2] sind Verweise auf das gleiche Objekt (l).

Wenn Sie die Liste an einem Ort ändern, wird sie überall geändert. Das liegt daran, dass Listen veränderbar Objekte sind.

Verwenden Sie stattdessen mehrere Listen:

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

Welche wie beabsichtigt funktionieren.

2

Es ist durchaus möglich, dass Sie die Liste wie folgt erstellt:

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

oder äquivalent:

mySolution = [[0]*4]*4 

Entweder die obigen Snippets erstellen eine Liste mit vier Unterlisten, die c sind Opies of die genaue, gleiche Unterliste, so dass jede Änderung auf einer Unterliste wird auf die anderen reflektiert - sie sind ein und dasselbe. Die Lösung ist vier verschiedene Sublisten zu erstellen:

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

Oder etwas kürzer:

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

Bitte beachten Sie, dass dies tut gut:

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]] 

es hängt alles davon ab, wie Sie initialisierten Ihre solution.diese

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

gibt

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

weil hier jedes Array [0, 0, 0, 0] in mySolution eine Kopie der Initialisierung Array [0, 0, 0, 0] in [[0, 0, 0, 0]]*4 ist. Wenn Sie das erste Element des ersten Arrays ändern, ändert sich auch die Kopie.

Mit dieser Initialisierung mySolution = [[0, 0, 0, 0] for x in range(4)] kopieren Sie nicht das Array, sondern fügen Sie [0,0,0,0] vier Mal hinzu und geben das Ergebnis, das Sie erwarten.

Verwandte Themen