更改一个列表中的元素将更改多个列表

2024-04-20 13:36:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,上面写着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。


Tags: 元素列表mysolution
3条回答

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

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

mysolution = [[0] * 4 for i in range(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]*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)]

相关问题 更多 >