重新分配列表中列表的元素

时间:2014-11-04 21:33:20

标签: python list variable-assignment

我试图修改列表列表:

list = [['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0'], ['0', '0', '0', '0', '0', '0']]

特别是当我指定list[0][1]='X'时,list现在是:

[['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0'], ['0', 'X', '0', '0', '0', '0']]

不是仅重新分配第一个子列表的第二个元素,而是重新分配每个子列表的第一个元素。我不明白为什么会这样。有谁知道吗?

1 个答案:

答案 0 :(得分:3)

你必须像这样创建list

list = [['0', '0', '0', '0', '0', '0']] * 5

这样做会为相同的列表对象创建一个包含五个引用的列表:

>>> list = [['0', '0', '0', '0', '0', '0']] * 5
>>> id(list[0])
27391360
>>> id(list[1])
27391360
>>> id(list[2])
27391360
>>>

因此,当您修改一个子列表时,它们都会被更改。


要解决此问题,请改用list comprehension

lst = [['0', '0', '0', '0', '0', '0'] for _ in range(5)]

与当前代码不同,此解决方案将创建一个包含五个唯一子列表的列表。因此,改变一个不会影响其他人。

另外,我将列表名称更改为lst,以避免影响built-in。您永远不应该创建一个与内置名称相同的名称。


请注意,您也可以写:

lst = [['0'] * 6 for _ in range(5)]

这里做['0'] * 6不是问题,因为Python中的字符串是immutable objects。因此,['0'] * 6创建一个包含六个唯一字符串对象的列表。但是列表是mutable objects,因此无法像这样创建。