我是新来的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圈迭代。 有人可以解释为什么?
展开一个位(插入符号( ^
)是在循环“索引”):
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]
你必须试图修改你迭代集合时要小心。 在这种情况下,列表跟踪“当前位置”用一个简单的整数索引。 当您使用pop()
,一切都改变了指数等元素被跳过。
在循环的第一次迭代中,i是L [0]。 然后你弹出的列表中,那么你访问L [1],这是最初以1 [2]。 然后你弹出的列表中,并在下一次迭代访问L [2],这是曾经被认为是在L [4]等。
有没有必要流行在这段代码中的元素,无论如何,想必你正在做的事情更加复杂的实际代码。
你可以使用while
循环,而不是for
循环完成这个任务。
while len(some_list)>0 :
some_list.pop(0)
一个for
循环实际上将遍历在列表中,这将无法正常工作,在列表中的索引将在每次删除更改的每个项目,你会不会最终得到的所有项目。
然而, while
循环会在每次循环运行时检查的条件,如果它仍然是真实的,再次运行该代码。 在这里,我们指定列表的长度必须大于0,即必须有列表中的内容。
Python不支持改变一个列表的长度,而你遍历它。 在副本上工作或使用列表理解来代替。
想想Python是如何真正做的for循环 - 它通过元素计数,目前指数在返回的项目。 当你删除一个,该指数是指不同的元素。
文章来源: Why does a for-loop with pop-method (or del statement) not iterate over all list elements