Python:将一个列表附加到另一个列表并清除第一个列表

Python:将一个列表附加到另一个列表并清除第一个列表,python,list,Python,List,这让我大吃一惊。我正在编写一个python代码,其中我创建了一个列表,将其附加到主列表中,并清除第一个列表以向其中添加更多元素。当我清除第一个列表时,甚至主列表也会被清除。我处理了很多列表附件和清除,但从未观察到这一点 list1 = [] list2 = [] list1 = [1,2,3] list2.append(list1) list1 [1, 2, 3] list2 [[1, 2, 3]] del list1[:] list1 [] list2 [[]] 我知道在附加字典时会发生这种

这让我大吃一惊。我正在编写一个python代码,其中我创建了一个列表,将其附加到主列表中,并清除第一个列表以向其中添加更多元素。当我清除第一个列表时,甚至主列表也会被清除。我处理了很多列表附件和清除,但从未观察到这一点

list1 = []
list2 = []
list1 = [1,2,3]
list2.append(list1)
list1
[1, 2, 3]
list2
[[1, 2, 3]]
del list1[:]
list1
[]
list2
[[]]
我知道在附加字典时会发生这种情况,但我不知道如何处理列表。有人能详细说明一下吗


我正在使用Python2.7将
列表
传递给类似
append
的方法只是传递对
list1
引用的同一
列表
的引用,因此这就是添加到
list2
的内容。它们仍然是相同的
列表
,只是从两个不同的地方引用

如果要切断它们之间的联系,请执行以下任一操作:

  • 插入一份
    list1
    ,而不是
    list1
    本身,例如
    list2.append(list1[:])
    ,或
  • del list1[:]
    更改为
    list1=[]

  • 注意:这有点不清楚,但是如果您想将
    list1
    的内容添加到
    list2
    (因此
    list2
    应该变成
    [1,2,3]
    而不是
    [1,2,3]
    和嵌套的
    列表中的值),您应该调用
    list2.extend(list1)
    ,而不是
    append
    ,在这种情况下,不需要浅拷贝;当时
    list1
    中的值将单独
    append
    ed,并且
    list1
    list2
    之间不会存在进一步的联系(由于值是不可变的,例如嵌套的
    list
    s、
    dict
    s等,因此需要复制它们以完全断开连接,例如,对于复杂的嵌套结构)。

    因此基本上代码就是这样做的:

    删除前

    删除后

    简而言之,两个列表名称都指向同一个列表对象


    同样的问题也发生在我身上

    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[:]
    

    多亏了@ShadowRanger.

    这可能会提供一些见解: