Python 正在删除列表中的项而不引用

Python 正在删除列表中的项而不引用,python,python-3.x,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

我有一个循环,它没有提到一个列表,但是在它完成之后,列表缺少了它的一个项

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

我想在你发布代码之前的某个地方,你有
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
时,两个变量名都引用同一个列表。
如果将其转换为新列表,则会在内存中复制列表,因此每个变量指向不同的列表


这不是一个新的论据,因此,这提供了一些非常有趣的答案和解释,说明了为什么会发生这种情况,这些是解决方案,以及每个解决方案的优点/缺点 如果是这种情况,您应该使用
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
时,两个变量名都引用同一个列表。
如果将其转换为新列表,则会在内存中复制列表,因此每个变量指向不同的列表


这不是一个新的论点,因此,这提供了一些非常有趣的答案和解释,说明了为什么会发生这种情况,哪些是解决方案,以及每个解决方案的优缺点

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

testlist = numlist.copy()
通过这种方式,您可以克隆列表,而无需为原始列表创建任何引用对象

作为 在评论中提到,你也可以这样做

testlist = numlist[:]

执行此操作时,您正在创建对
numlist
的引用

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

testlist = numlist.copy()
通过这种方式,您可以克隆列表,而无需为原始列表创建任何引用对象

作为 在评论中提到,你也可以这样做

testlist = numlist[:]

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

testlist = numlist.copy()

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

testlist = numlist.copy()

numlist
testlist
来自哪里?您确定它们不是同一个列表吗?除了其他答案之外,您还可以通过
testlist=numlist[:]
复制您的列表下面的答案是否解决了您的问题?如果他们这样做了,那么就把你认为最好的答案标记为被接受。由于您似乎不熟悉堆栈溢出,您应该阅读
numlist
testlist
来自哪里?您确定它们不是同一个列表吗?除了其他答案之外,您还可以通过
testlist=numlist[:]
复制您的列表下面的答案是否解决了您的问题?如果他们这样做了,那么就把你认为最好的答案标记为被接受。由于您似乎不熟悉堆栈溢出,您应该了解另一种创建列表浅层副本的常用方法是使用切片表示法:
testlist=numlist[:]
@HåkenLid:True。感谢您的评论创建列表的浅层副本的另一种常见方法是使用切片表示法:
testlist=numlist[:]
@HåkenLid:True。谢谢你的邀请comment@buran这是一个清楚的解释。向下滚动到特定的细节部分。我无法更改注释/链接,但我添加了它,因为它对python的解释非常好names@buran这是一个清楚的解释。向下滚动到特定的细节部分。我无法更改注释/链接,但我添加了它,因为它非常好地解释了python名称