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

Pav*_*van 13 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]]
Run Code Online (Sandbox Code Playgroud)

预期产量:

[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)

为什么我的列表列表中的所有第一个元素都被更改为1?我只想将第一个列表的第一个元素更改为1.

pok*_*oke 15

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

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

mysolution = [[0] * 4 for i in range(4)]
Run Code Online (Sandbox Code Playgroud)

  • @Pavan:那是行不通的,因为它是相同列表的四次。戳解决方案避免了这一点。 (2认同)

Ósc*_*pez 6

你很有可能像这样创建了这个列表:

mySolution = [0]*4
mySolution = [mySolution]*4
Run Code Online (Sandbox Code Playgroud)

或等效地:

mySolution = [[0]*4]*4
Run Code Online (Sandbox Code Playgroud)

上述任何一个片段都会创建一个包含四个子列表的列表,这四个子列表是完全相同的子列表的副本,因此对一个子列表的任何修改都将反映在其他子列表上 - 它们是同一个.解决方案是创建四个不同的子列表:

mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)

或者更短一些:

mySolution = [[0]*4 for _ in xrange(4)]
Run Code Online (Sandbox Code Playgroud)