在我的Python 2.7.2 IDLE解释器中:
>>> mylist = [1, 2, 3, 4, 5]
>>> for item in mylist:
mylist.remove(item)
>>> mylist
[2, 4]
为什么?
答案 0 :(得分:4)
这是因为当您遍历列表时python keeps track of the index in the list。请考虑以下代码:
for i in range(len(mylist)):
if i >= len(mylist):
break
item = mylist[i]
mylist.remove(item)
如果我们跟踪这个(这实际上是python在你的代码中做了什么),那么我们看到当我们删除列表中的项目时,右边的数字向左移动一个位置以填充剩下的空白我们删除了该项目。正确的项目现在位于索引i
,因此在迭代中永远不会看到它,因为接下来发生的事情是我们为for循环的下一次迭代增加i
。
现在有点聪明。相反,如果我们向后遍历列表,我们将清除列表:
for item in reversed(mylist):
mylist.remove(item)
这里的原因是我们在for循环的每次迭代中都将一个项目从列表的末尾开始。由于我们总是把项目放在最后,所以不需要转移(假设列表中的唯一性 - 如果列表不是唯一的,结果是相同的,但参数变得有点复杂)。
当然,如果您要从列表中删除所有项目,您可以非常轻松地执行此操作:
del mylist[:]
或甚至使用切片分配:
mylist[:] = []
(我提到了后者,因为将列表的片段替换为甚至不需要相同长度的其他项目会很有用。)
答案 1 :(得分:3)
那是因为你在迭代它时修改列表,而是迭代浅拷贝:
>>> mylist = [1, 2, 3, 4, 5]
>>> for item in mylist[:]: #use mylist[:] or list(mylist)
mylist.remove(item)
...
>>> mylist
[]
答案 2 :(得分:2)
您在循环浏览时正在修改列表,这是非常糟糕的做法。
答案 3 :(得分:2)
问题是你在迭代它时改变列表。改为使用列表理解:
mylist = [1, 2, 3, 4, 5]
mylist = [x for x in mylist if condition(x)]
答案 4 :(得分:0)
>>> mylist = [1, 2, 3, 4, 5]
>>> for item in mylist:
mylist.remove(item)
在这个循环中: 第一次将第0个元素(1)作为项目并将其从mylist.so中移除后,该mylist将为[2,3,4,5],但指针将位于新mylist的第1个元素中[(2) ,3,4,5])即3.它将删除3.so 2将不会从列表中删除。
这就是为什么在完全操作[2,4]之后会留下的。
using for loop:-
>>>for i in range(len(mylist)):
mylist.remove(mylist[0])
i-=1
>>>mylist
[]
您可以使用while循环执行此操作:
>>>mylist = [1, 2, 3, 4, 5]
>>>while (len(mylist)>0):
mylist.remove(mylist[0])
print mylist
答案 5 :(得分:0)
使用mylist
mylist = [1, 2, 3, 4, 5]
l = [k for k in mylist] # deep copy
for i in range(len(mylist)):
mylist.remove(l[i])
print
print mylist