2013-09-22 16 views
6

Mam lista Lista powiedzieć mysolution:Zmiana elementu na jednej liście powoduje zmianę wielu list ...?

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

Przewidywana wyjściowa:

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

dlaczego jest to, że wszystkie elementy w 1st mojej liście jest lista zostanie zmieniona na 1? Chciałbym tylko zmienić pierwszy element pierwszej listy na 1.

+4

Oh brzydkie 'n operator * list'! Szczerze mówiąc, nie miałbym nic przeciwko gdyby zwrócił wyjątek, gdy wykryto Zmienne typy .. – user2246674

Odpowiedz

8

Liczy się sposób, w jaki utworzyłeś swoją oryginalną listę mysolution. Jak się wydaje, zawiera czterokrotnie tę samą listę, dlatego zmiana go raz spowoduje zmianę we wszystkich czterech lokalizacjach.

Aby zainicjować niezależne zerowej wypełnionych list tak, można wykonać następujące czynności:

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

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

+1

@Pavan: To nie będzie działać, bo to ta sama lista czterokrotnie , Rozwiązanie grzebać za aviods że. – flornquake

2

Ponieważ wszystkie zawarte listy są w rzeczywistości na tej samej liście. Gdy to zrobisz:

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

Następnie my_solution[0], my_solution[1] i my_solution[2] są odwołania do tego samego obiektu (l).

Jeśli zmienisz listę w jednym miejscu, zmieni się ona wszędzie. Dzieje się tak dlatego, że listy są obiektami zmiennymi zmiennymi.

Zamiast korzystać z wielu list:

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

który będzie działał zgodnie z przeznaczeniem.

2

Jest całkiem możliwe, że stworzył listę takiego:

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

lub równoważnie:

mySolution = [[0]*4]*4 

Każdy z powyższych fragmentów tworzy listę z czterema podlistami, które są Opierając się na dokładnej, tej samej podlistie, każda modyfikacja na jednej podlistie zostanie odzwierciedlona na pozostałych - są one jednym i tym samym. Rozwiązaniem jest utworzenie czterech różne listy zagnieżdżone:

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

Albo nieco krótsze:

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

proszę zauważyć, że ma się dobrze:

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

to wszystko zależy od tego, jak zainicjowałeś swoje solution.to

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

daje

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

bo tutaj każdy tablica [0, 0, 0, 0] w mySolution jest kopią inicjalizacji tablicy [0, 0, 0, 0] w [[0, 0, 0, 0]]*4. jeśli zmienisz pierwszy element tablicy, pierwszy egzemplarz nim również zmienić.

przy tej inicjalizacji mySolution = [[0, 0, 0, 0] for x in range(4)] nie kopiujesz tablicy, ale dodajesz cztery razy [0,0,0,0], co daje oczekiwany rezultat.

Powiązane problemy