考虑在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
的内容也被清空。为什么会这样呢?
考虑在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
的内容也被清空。为什么会这样呢?
append
的方法传递一个 list
参数时,实际上传递的是指向由 list1
引用的同一个 list
的引用,这个被引用的 list
被附加到了 list2
上。它们仍然是同一个 list
,只是从两个不同的位置引用而已。list1
的副本,而不是 list1
本身,例如 list2.append(list1[:])
;或者list1
为新的 list
,而不是原地清除,将 del list1[:]
更改为 list1 = []
。list1
中的内容添加到 list2
中(因此,list2
应该变成 [1, 2, 3]
而不是嵌套 list
中的 [[1, 2, 3]]
),那么应该调用 list2.extend(list1)
而不是 append
,在这种情况下,不需要浅拷贝;当时的来自 list1
的值将被单独地附加,list1
和 list2
之间也不再存在进一步联系(因为这些值是不可变的 int
类型;如果它们是可变的,例如嵌套的列表、字典等等,则需要将它们复制以完全切断联系,例如对于复杂的嵌套结构,可以使用 copy.deepcopy
)。我也遇到了同样的问题。
original_list = ["a.csv", "b.csv"]
copied_list = original_list
original_list.clear()
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[:]