为什么'append'会改变列表中的所有元素?

时间:2014-01-02 01:55:22

标签: python list

我正在建立一个列表清单。我正在读取输入文件中的元素。我正在读每个 将文件中的行作为字符串单元素排到列表中的子列表中。首先,我创造了 列表清单:

>>> b = [[]] * 5

然而,当我尝试追加一个项目时,我得到了以下内容:

>>> b[1].append("abc")
>>> b
[ ['abc'], ['abc'], ['abc'], ['abc'], ['abc'])

为什么append会更改所有子列表?在这种情况下,insert()会更好吗?

3 个答案:

答案 0 :(得分:7)

当你执行[[]] * 5时,它是重复5次的相同对象列表(此处为空列表)。

您可以通过以下方式查看:

>>> b = [[]] *5

>>> b
[[], [], [], [], []]

>>> id(b[0])
140588316211896

>>> id(b[1])
140588316211896

您需要做的是:

>>> b = [[] for i in range(5)]
>>> b[0].append('abc')
>>> b
[['abc'], [], [], [], []]

如果是[[] for i in range(5)],则在每个循环中创建一个新的空列表对象。

插入不是一个好的选择,因为insert是O(n)操作,而追加是O(1)

答案 1 :(得分:1)

当你说

b = [[]] * 5

它创建了5个列表,这些列表都指向同一个东西。如果你打印出每个元素的地址,你会发现它们是相同的。

因此,您使用append还是insert无关紧要。

答案 2 :(得分:0)

这是常见问题解答。所有5个顶级列表元素都指向同一个列表。

检查出来:

#!/usr/local/cpython-3.3/bin/python

if True:
    b = [[] for dummy in range(5)]
else:
    b = [[]] * 5

b[1].append("abc")

print(b)