我正在尝试修改列表列表:
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']]
它不只是重新分配第一个子列表的第二个元素,而是重新分配每个子列表的第一个元素。我不明白为什么会发生这种情况。有谁知道吗?
最佳答案
您必须像这样创建列表
:
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
在这里不是问题,因为字符串是 immutable objects在Python中。因此,['0'] * 6
创建一个包含六个唯一字符串对象的列表。然而列表是 mutable objects因此不能像这样创建。
关于python - 重新分配列表内列表的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26745441/