我有一个循环,其中没有提及列表,但是在完成后,该列表缺少其中一项。
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
答案 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()