为什么向一个列表追加内容会同时影响我列表中的所有列表?
假设我做了以下操作:
>>> l = [[]]*2
>>> l
[[], []]
>>> l[0].append(1)
>>> l
[[1], [1]]
为什么1会被添加到两个列表中呢?
4 个回答
5
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
这个表达式创建了一个包含两个指向同一个列表的引用的列表。你在这个列表上添加内容,然后就会看到这个内容出现了两次。