2013-09-22 63 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]四次,给出您所期待的结果。

相关问题