我试图修改列表列表:
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']]
不是仅重新分配第一个子列表的第二个元素,而是重新分配每个子列表的第一个元素。我不明白为什么会这样。有谁知道吗?
答案 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,因此无法像这样创建。