Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么带有pop方法(或del语句)的for循环不会迭代所有列表元素_Python_List_Loops_For Loop - Fatal编程技术网

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

Python 为什么带有pop方法(或del语句)的for循环不会迭代所有列表元素,python,list,loops,for-loop,Python,List,Loops,For Loop,我是Python新手,正在尝试列表 我正在linux2上使用Python 3.2.3(默认值,2012年10月19日,20:13:42),[GCC 4.6.3] 这是我的样本代码 >>> 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

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

这是我的样本代码

>>> 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圈后停止迭代。有人能解释一下原因吗?

Python不支持在迭代列表时更改列表的长度。制作一份副本或使用一份副本


想想Python实际上是如何执行for循环的——它对元素进行计数,在当前索引处返回项。删除一个元素时,索引意味着另一个元素。

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

在循环的第一次迭代中,i是l[0]。然后弹出列表,然后访问l[1],这是最初在l[2]的位置。然后弹出列表,下一次迭代访问l[2],这是以前在l[4]的位置,以此类推

无论如何,不需要在此代码中弹出元素,可能您正在实际代码中执行更复杂的操作。

稍微展开一点(插入符号(
^
)位于循环“索引”):

在弹出第一项后:

your_list = [2,3,4,5,6]
             ^
your_list = [3,4,5,6]
               ^
your_list = [4,5,6]
                 ^
现在继续循环:

your_list = [2,3,4,5,6]
               ^
your_list = [3,4,5,6]
                 ^
现在弹出第一项:

your_list = [2,3,4,5,6]
             ^
your_list = [3,4,5,6]
               ^
your_list = [4,5,6]
                 ^
现在继续循环:

your_list = [2,3,4,5,6]
               ^
your_list = [3,4,5,6]
                 ^
现在弹出第一项:

your_list = [2,3,4,5,6]
             ^
your_list = [3,4,5,6]
               ^
your_list = [4,5,6]
                 ^
现在继续循环--等等,我们完成了。:-)



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

while len(some_list)>0 :
    some_list.pop(0)
for
循环实际上会在列表中的每个项目上迭代,这不会起作用,因为列表中的索引会随着每次删除而改变,并且最终不会得到所有项目

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

代码

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

在一种情况下,它可能会起作用。在每次迭代中弹出最后一个元素时。可能在某些情况下它可以工作。这不是你应该依赖的东西,但是,有更好的方法。Python确实支持在迭代列表时修改列表,并且一旦你理解了发生了什么,它就会以一致和可预测的方式工作。顺便说一句,对于某些用例,另一个有用的解决方法是按相反的顺序操作列表。你当然可以在遍历列表时对其进行修改,但我认为大多数情况下,你可能不应该这样做。@NedBatchelder的可能重复:虽然根本原因是相同的,但问题实质上是不同的。调用
pop
的原因甚至不一样(链接正在尝试跳过,而这一个不是)。您应该解释一个否决票。这个答案是正确的。这是处理提问者面临的问题的一个很好的答案,但它不是原始问题的计算机科学答案P我确实用它来解决我的问题,尽管如此。第二次迭代的打印如何显示弹出值2?因为在第一次迭代结束时,指针位于2,所以下一次迭代指针应该位于3。那么它不应该打印3而不是2吗?不,因为我总是弹出
0
th元素,而不是当前列表迭代器指针索引处的元素。