Why does a for-loop with pop-method (or del statement) not iterate over all list elements

不问归期 提交于 2019-11-28 01:08:58
mgilson

Unrolling a bit (the caret (^) is at the loop "index"):

your_list = [1,2,3,4,5,6]
             ^

after popping off the first item:

your_list = [2,3,4,5,6]
             ^

now continue the loop:

your_list = [2,3,4,5,6]
               ^

Now pop off the first item:

your_list = [3,4,5,6]
               ^

Now continue the loop:

your_list = [3,4,5,6]
                 ^

Now pop off first item:

your_list = [4,5,6]
                 ^

Now continue the loop -- Wait, we're done. :-)


>>> l = [1,2,3,4,5,6]
>>> for x in l:
...     l.pop(0)
... 
1
2
3
>>> print l
[4, 5, 6]

You have to be careful when attempting to modify collections you are iterating over. In this case, the list keeps track of the "current position" with a simple integer index. When you use pop(), everything changes index, and so elements are skipped.

On the first iteration of the loop, i is l[0]. Then you pop the list, then you access l[1], which is what originally was at l[2]. Then you pop the list, and the next iteration accesses l[2], which is what used to be at l[4], etc.

There's no need to pop elements in this code anyway, presumably you are doing something more complex in your real code.

johnny brin

You could use a while loop rather than a for loop for this task.

while len(some_list)>0 :
    some_list.pop(0)

A for loop will actually iterate over each item in the list, which will not work as the indices in the list will change with each deletion, and you will not end up getting all items.

However, a while loop will check a condition every time the loop is run, and if it is still true, run the code again. Here we specify that the length of the list has to be more than 0, i.e. there has to be content in the list.

Python doesn't support altering the length of a list while you iterate over it. Work on a copy or use a list comprehension instead.

Think about how Python is actually doing the for loop - it counts up through the elements, returning the item at the current index. When you remove one, the index means a different element.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!