Python 更改一个列表中的元素会更改多个列表

Python 更改一个列表中的元素会更改多个列表,python,list,python-2.7,Python,List,Python 2.7,我有一个列表,比如说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,

我有一个列表,比如说
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。

因为所有包含的列表实际上都是相同的列表。当您这样做时:

l = [0, 0, 0, 0]
my_solution = [l, l, l]
然后,
myu解决方案[0]
myu解决方案[1]
myu解决方案[2]
是对同一对象的引用(
l

如果在一个位置修改列表,它会在任何地方更改。这是因为列表是可变对象

相反,请使用多个列表:

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

它将按预期工作。

重要的是如何创建原始的
mysolution
列表。看起来,它包含四次相同的列表,这就是为什么更改一次会使它在所有四个位置都发生更改

要初始化这样的独立零填充列表,可以执行以下操作:

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

很可能您创建了如下列表:

mySolution = [0]*4
mySolution = [mySolution]*4
或相当于:

mySolution = [[0]*4]*4
上面的任何一个代码片段都将创建一个包含四个子列表的列表,这四个子列表都是完全相同的子列表的副本,因此对一个子列表的任何修改都将反映在其他子列表上——它们是相同的。解决方案是创建四个不同的子列表:

mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
或者再短一点:

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

请注意,这样做很好:

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]]
这完全取决于您如何初始化
解决方案
。这个

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

因为这里
mySolution
中的每个数组
[0,0,0,0]
都是
[[0,0,0,0]]*4
中初始化数组
[0,0,0,0,0]
的副本。如果更改第一个数组的第一个元素,它的副本也会更改


使用此初始化
mySolution=[[0,0,0,0]对于范围(4)中的x]
您不是在复制数组,而是在
[0,0,0]
中添加了四次,给出了您期望的结果。

哦,那个讨厌的
n*列表
操作符!老实说,我不介意在检测到可变类型时它是否抛出异常..mySolution=[0]*4 mySolution=[mySolution]*4@Pavan:这行不通,因为它是同一个列表的四倍。poke的解决方案避免了这一点。
>>> 
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
>>>