Python:将一个列表添加到另一个列表中并清空第一个列表

11

考虑在REPL中的这个例子:

>>> list1 = [1, 2, 3]
>>> list2 = []
>>> list2.append(list1)
>>> list1
[1, 2, 3]
>>> list2
[[1, 2, 3]]
>>> del list1[:]
>>> list1
[]
>>> list2
[[]]

使用 del list1[:] 清空 list1 后,list2 的内容也被清空。为什么会这样呢?


这可能会提供一些见解:https://docs.python.org/2/library/copy.html - Eugen Constantin Dinca
3个回答

14
将类似于 append 的方法传递一个 list 参数时,实际上传递的是指向由 list1 引用的同一个 list 的引用,这个被引用的 list 被附加到了 list2 上。它们仍然是同一个 list,只是从两个不同的位置引用而已。
如果你想要切断它们之间的联系,可以选择以下任一方式:
  1. 插入 list1 的副本,而不是 list1 本身,例如 list2.append(list1[:]);或者
  2. 在附加后替换 list1 为新的 list,而不是原地清除,将 del list1[:] 更改为 list1 = []
注意:有点不太清楚,但是如果你想将 list1 中的内容添加到 list2 中(因此,list2 应该变成 [1, 2, 3] 而不是嵌套 list 中的 [[1, 2, 3]]),那么应该调用 list2.extend(list1) 而不是 append,在这种情况下,不需要浅拷贝;当时的来自 list1 的值将被单独地附加,list1list2 之间也不再存在进一步联系(因为这些值是不可变的 int 类型;如果它们是可变的,例如嵌套的列表、字典等等,则需要将它们复制以完全切断联系,例如对于复杂的嵌套结构,可以使用 copy.deepcopy)。

8

所以,基本上这段代码在做什么:

删除前

图片描述信息

删除后

图片描述信息

简单来说,两个列表名称都指向同一个列表对象。

代码视图来源


1

我也遇到了同样的问题。

original_list = ["a.csv", "b.csv"]                
copied_list = original_list
original_list.clear()

当我这样做时,两个列表(original_list和copied_list)都被清空了。对我有用的解决方案是,
original_list = ["a.csv", "b.csv"]                
copied_list  = original_list
original_list = [] # original_list  is refreshed with a fresh list.

这也可以工作,
original_list = ["a.csv", "b.csv"]
copied_list = original_list[:]

感谢 @ShadowRanger。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接