我正在建立一个列表清单。我正在读取输入文件中的元素。我正在读每个 将文件中的行作为字符串单元素排到列表中的子列表中。首先,我创造了 列表清单:
>>> b = [[]] * 5
然而,当我尝试追加一个项目时,我得到了以下内容:
>>> b[1].append("abc")
>>> b
[ ['abc'], ['abc'], ['abc'], ['abc'], ['abc'])
为什么append
会更改所有子列表?在这种情况下,insert()
会更好吗?
答案 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)