更改一个列表中的元素更改多个列表..?

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

重要的是你如何创build你的原始mysolution列表。 看起来,它包含了四次相同的列表,这就是为什么改变它一次将使它在所有四个位置改变。

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

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

你很有可能创build了这样的列表:

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

或等同地:

 mySolution = [[0]*4]*4 

上面的任何一个片段都会创build一个带有四个子列表的列表,这四个子列表是完全相同的子列表的副本,所以对一个子列表的任何修改都会反映在其他列表中 – 它们是一个一样的。 解决scheme是创build四个不同的子列表:

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

或者更短一些:

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

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

 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] 

这将按预期工作。

请注意,这是做得很好:

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

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

这个初始化mySolution = [[0, 0, 0, 0] for x in range(4)] [0,0,0,0] mySolution = [[0, 0, 0, 0] for x in range(4)]你不是复制数组,而是追加[0,0,0,0]四次,给出你期待的结果。