我有一个List列表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。
答案 0 :(得分:12)
重要的是您创建原始mysolution
列表的方式。看起来,它包含相同列表的四倍,这就是为什么更改它一次会使它在所有四个位置都发生变化。
要初始化这样的独立零填充列表,您可以执行以下操作:
mysolution = [[0] * 4 for i in range(4)]
答案 1 :(得分:5)
很有可能你创建了这样的列表:
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)]
答案 2 :(得分:2)
因为所有包含的列表实际上是相同的列表。当你这样做时:
l = [0, 0, 0, 0]
my_solution = [l, l, l]
然后,my_solution[0]
,my_solution[1]
和my_solution[2]
是对同一对象(l
)的引用。
如果您在一个位置修改列表,它会随处更改。这是因为列表是可变的对象。
相反,请使用多个列表:
l1 = [0, 0, 0, 0]
l2 = [0, 0, 0, 0]
l3 = [0, 0, 0, 0]
my_solution = [l1, l2, l3]
哪个会按预期工作。
答案 3 :(得分: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]
追加四次,从而得到您期望的结果。