为什么带有pop-method(或del语句)的for循环不会遍历所有列表元素

use*_*757 8 python loops for-loop list

我是Python新手并尝试使用Python 3.2.3(默认,2012年10月19日,20:13:42),linux2上的[GCC 4.6.3]

这是我的样本代码

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

我期待以下输出

1
[2, 3, 4, 5, 6]
2
[3, 4, 5, 6]
3
[4, 5, 6]
4
[5, 6]
5
[6]
6
[]
Run Code Online (Sandbox Code Playgroud)

相反,我得到了这个

1
[2, 3, 4, 5, 6]
2
[3, 4, 5, 6]
3
[4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

for循环在3转后停止迭代.有人可以解释一下原因吗?

小智 11

对于此任务,您可以使用while循环而不是for循环。

while len(some_list)>0 :
    some_list.pop(0)
Run Code Online (Sandbox Code Playgroud)

一个for循环将列表中的每个项目,这将无法正常工作,在列表中的索引将与每个缺失改变实际迭代,你会不会最终得到的所有项目。

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

  • 你应该解释一个downvote。这个答案是正确的。 (2认同)

mgi*_*son 8

展开一点(插入符号(^)位于循环"索引"):

your_list = [1,2,3,4,5,6]
             ^
Run Code Online (Sandbox Code Playgroud)

弹出第一个项目后:

your_list = [2,3,4,5,6]
             ^
Run Code Online (Sandbox Code Playgroud)

现在继续循环:

your_list = [2,3,4,5,6]
               ^
Run Code Online (Sandbox Code Playgroud)

现在弹出第一个项目:

your_list = [3,4,5,6]
               ^
Run Code Online (Sandbox Code Playgroud)

现在继续循环:

your_list = [3,4,5,6]
                 ^
Run Code Online (Sandbox Code Playgroud)

现在弹出第一项:

your_list = [4,5,6]
                 ^
Run Code Online (Sandbox Code Playgroud)

现在继续循环 - 等等,我们完成了.:-)


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