python - 重新分配列表内列表的元素

标签 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']]

它不只是重新分配第一个子列表的第二个元素,而是重新分配每个子列表的第一个元素。我不明白为什么会发生这种情况。有谁知道吗?

最佳答案

您必须像这样创建列表:

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/

相关文章:

python - 离线时如何安装 conda 环境?

python - 从句子中提取介词短语

css - 大小相等的列表项

c# - 如何一次性删除通用列表中的所有空元素?

python - 在 Python 中压缩 `x if x else y` 语句

python - 为什么分配给空列表(例如 [] = "")不会出错?

Python 从文本文件中读取数字

python - 分组 DataFrame,将函数与输入一起应用,然后将结果添加回原始数据

python - 如何从另一个列表创建嵌套列表?

r - 函数 `[<-` 将 _replace_ 一个元素,但不附加一个 _element_