列表中的项目已删除,无需参考

时间:2018-12-20 14:11:47

标签: python python-3.x

我有一个循环,其中没有提及列表,但是在完成后,该列表缺少其中一项。

print(numlist)
testlist=numlist
print(testlist)

for i in range(5):
    print(numlist)
    list1=[]
    for numbers in testlist:
        list1.append(numbers[i])

    print(str(numlist)+'before')

    for numbers in testlist: #NUMLIST IS LOSING SOMETHING HERE
        if max(list1)>numbers[i]: 
            testlist.remove(numbers)

    print(str(numlist)+'after')

输出

[[13, 13, 13, 2, 2], [13, 13, 13, 3, 3]]before
[[13, 13, 13, 3, 3]]after

3 个答案:

答案 0 :(得分:3)

这样做时,您正在创建对numlist的引用

testlist=numlist

因此,您对numlist所做的任何更改都会反映在testlist中。同样,对testlist所做的任何更改也将反映在numlist中。创建列表副本的一种方法是使用

testlist = numlist.copy()

这样,您可以在不创建原始列表引用对象的情况下克隆列表。

Håken Lid  和评论中提到的benvc,您也可以这样做

testlist = numlist[:]

答案 1 :(得分:2)

我想您发布代码之前的某个地方有numlist = testlist
在这种情况下,您应该使用numlist = list(testlist)创建同一列表的另一个实例。

这是正在发生的事情:

a = [1,2,3,4,5,6,7,8,9]
b = a
print a # OUTPUT: [1,2,3,4,5,6,7,8,9]
b.pop()
print a # OUTPUT: [1,2,3,4,5,6,7,8]

之所以会发生这种情况,是因为设置numlist = testlist时,两个变量名都引用同一列表。
如果将其转换为新列表,则会在内存中复制列表,因此每个变量都指向不同的列表。

这不是关于SO的新论据,QA提供了一些非常有趣的答案和解释,说明了为什么会发生这种情况,它们是解决方案以及每种解决方案的优点/缺点

答案 2 :(得分:0)

这是因为您创建了numlist的浅表副本。 testlist和numlist都将具有浅拷贝(按位拷贝)的相同地址。对任何一个列表执行任何操作时,由于地址相同,它会反映到两个列表中。 为测试列表创建一个新实例,以便测试列表和数字列表具有不同的地址但具有相同的数据。 您可以使用以下内容:

testlist = numlist.copy()