为什么一个for循环弹出式法(或del语句)不遍历所有列表元素(Why does a for-loo

2019-07-05 16:43发布

我是新来的Python与名单我使用Python 3.2.3试验(默认情况下,2012年10月19日,二十时13分42秒),[GCC 4.6.3] linux2的上

这里是我的samplecode

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

我希望下面的输出

1
[2, 3, 4, 5, 6]
2
[3, 4, 5, 6]
3
[4, 5, 6]
4
[5, 6]
5
[6]
6
[]

相反,我得到这个

1
[2, 3, 4, 5, 6]
2
[3, 4, 5, 6]
3
[4, 5, 6]

for循环停止后3圈迭代。 有人可以解释为什么?

Answer 1:

展开一个位(插入符号( ^ )是在循环“索引”):

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

突然离开的第一个项目后:

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

现在继续循环:

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

现在流行过的第一个项目:

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

现在继续循环:

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

现在流行过的第一个项目:

your_list = [4,5,6]
                 ^

现在继续循环 - 等待,我们就大功告成了。 :-)


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


Answer 2:

你必须试图修改你迭代集合时要小心。 在这种情况下,列表跟踪“当前位置”用一个简单的整数索引。 当您使用pop() ,一切都改变了指数等元素被跳过。

在循环的第一次迭代中,i是L [0]。 然后你弹出的列表中,那么你访问L [1],这是最初以1 [2]。 然后你弹出的列表中,并在下一次迭代访问L [2],这是曾经被认为是在L [4]等。

有没有必要流行在这段代码中的元素,无论如何,想必你正在做的事情更加复杂的实际代码。



Answer 3:

你可以使用while循环,而不是for循环完成这个任务。

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

一个for循环实际上将遍历在列表中,这将无法正常工作,在列表中的索引将在每次删除更改的每个项目,你会不会最终得到的所有项目。

然而, while循环会在每次循环运行时检查的条件,如果它仍然是真实的,再次运行该代码。 在这里,我们指定列表的长度必须大于0,即必须有列表中的内容。



Answer 4:

Python不支持改变一个列表的长度,而你遍历它。 在副本上工作或使用列表理解来代替。

想想Python是如何真正做的for循环 - 它通过元素计数,目前指数在返回的项目。 当你删除一个,该指数是指不同的元素。



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