为什么向一个列表追加内容会同时影响我列表中的所有列表?

24 投票
4 回答
5112 浏览
提问于 2025-04-17 00:52

假设我做了以下操作:

>>> l = [[]]*2
>>> l
[[], []]
>>> l[0].append(1)
>>> l
[[1], [1]]

为什么1会被添加到两个列表中呢?

4 个回答

5

展示内存布局的区别:

listOfLists = [[]] * 3
listOfListsRange = [[] for i in range(0, 3)]

在pythontutor中运行

在python tutor中显示的内存布局

14

其实只有一个列表。想想这个:

>>> l = [[]]
>>> l2 = l*2
>>> l2[0] is l[0]
True
>>> l2[1] is l[0]
True

*2 对一个列表进行操作时,并不是复制这个列表,而是返回一个长度为 2 的新列表,这个新列表里的内容都是指向原来列表的同一个引用。

你可能想要的是这个:

>>> l = [[] for _ in xrange(2)]

正如 @Asterisk 在评论中提到的,所有常见的集合都有类似的表现。因此,作为一个经验法则,最好只在不可变类型和有值语义的情况下使用乘法

20

[[]]*2 这个表达式创建了一个包含两个指向同一个列表的引用的列表。你在这个列表上添加内容,然后就会看到这个内容出现了两次。

撰写回答