【发布时间】:2013-07-16 04:36:27
【问题描述】:
我确信这已经在某个地方得到了回答,但我不知道如何描述它。
假设我想创建一个包含 3 个空列表的列表,如下所示:
lst = [[], [], []]
我以为我这样做很聪明:
lst = [[]] * 3
但我在调试了一些奇怪的行为后发现,这会导致一个子列表的追加更新,比如lst[0].append(3),以更新整个列表,使其成为[[3], [3], [3]],而不是[[3], [], []]。
但是,如果我用
初始化列表lst = [[] for i in range(3)]
然后执行lst[1].append(5)给出预期的[[], [5], []]
我的问题是为什么会发生这种情况?有趣的是,如果我这样做了
lst = [[]]*3
lst[0] = [5]
lst[0].append(3)
然后单元格 0 的“链接”被破坏,我得到[[5,3],[],[]],但lst[1].append(0) 仍然导致[[5,3],[0],[0]。
我的最佳猜测是使用 [[]]*x 形式的乘法会导致 Python 存储对单个单元格的引用...?
【问题讨论】:
-
@RoadieRich 但是这里的答案有更好的解释和官方文档的链接。
-
@AseemBansal:那么这些答案应该添加到 other 问题中吗?
-
这绝对是重复的。 stackoverflow.com/questions/240178/… 和 stackoverflow.com/questions/1605024/… 和 stackoverflow.com/questions/6688223/… 以及其他我现在找不到的。
-
我将 3 个问题标记为重复。
标签: python list nested-lists mutable