2013-09-22 59 views
6

我有名單列表說mysolution更改一個列表中的元素會更改多個列表..?

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

預期輸出:

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

那爲什麼在我的名單的名單第一要素被改變爲1? 我只想將第一個列表的第一個元素更改爲1.

+4

哦,討厭'n * list'操作符!我真的不會介意,如果它在檢測到可變類型時拋出異常。 – user2246674

回答

8

重要的是你如何創建你的原始mysolution列表。看起來,它包含四次相同的列表,這就是爲什麼改變它一次會使它在所有四個位置都改變的原因。

初始化獨立的零填充的名單一樣,你可以做到以下幾點:

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

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

+1

@Pavan:這不起作用,因爲它是同一個列表四次。戳的解決方案aviods。 – flornquake

2

因爲所有包含的列表實際上都是相同的列表。當你這樣做:

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

然後,my_solution[0]my_solution[1],和my_solution[2]是同一個對象(l)引用。

如果您在一個位置修改列表,它在任何地方都會改變。那是因爲名單是mutable對象。

相反,使用多個列表:

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

如預期這將正常工作。

2

這很可能是你創建的列表如下:

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

或等價:

mySolution = [[0]*4]*4 

以上任何一個片段都會創建一個帶有四個子列表的列表,它們是c 的確切的,相同的子列表,所以對一個子列表的任何修改都會反映在其他子列表上 - 它們是一樣的。解決的辦法是創建四個不同子列表:

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

或者短一點:

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

請注意,這是做精:

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

這一切都取決於如何你初始化了你的solution。這

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

因爲在這裏每個數組[0, 0, 0, 0]mySolution是初始化數組[0, 0, 0, 0][[0, 0, 0, 0]]*4副本。如果你改變第一個數組的第一個元素,它的副本也會改變。

與此初始化mySolution = [[0, 0, 0, 0] for x in range(4)]您不復制數組,但追加[0,0,0,0]四次,給出您所期待的結果。

相關問題