繁体   English   中英

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

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

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

这是我的示例代码

>>> 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]

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

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

for循环实际上会遍历列表中的每个项目,这将不起作用,因为列表中的索引会随着每次删除而改变,并且您最终不会获得所有项目。

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

尝试修改正在迭代的集合时必须小心。 在这种情况下,列表使用简单的整数索引跟踪“当前位置”。 当您使用pop() ,所有内容都会更改索引,因此会跳过元素。

在循环的第一次迭代中,i 是 l[0]。 然后弹出列表,然后访问 l[1],这就是最初在 l[2] 处的内容。 然后你弹出列表,下一次迭代访问 l[2],这就是以前在 l[4] 等处的内容。

无论如何都不需要在这段代码中弹出元素,大概你在你的真实代码中做了一些更复杂的事情。

Python 不支持在迭代列表时更改列表的长度。 处理副本或改用列表理解

想一想 Python 实际上是如何执行 for 循环的——它对元素进行计数,返回当前索引处的项目。 当您删除一个时,索引表示不同的元素。

代码

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

返回

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

while li:
    # For descending order
    # print(li.pop())

    # For ascending order
    print(li.pop(0))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM