Python:在循环列表时删除列表中的元素

Python:在循环列表时删除列表中的元素,python,list,Python,List,这里有一个简单的问题。我的任务是循环一个列表并打印它拥有的每个元素。在每次打印之后,我也打算从列表中删除这个元素。我的代码是: >> a = [1,2] >> for x in a: >> print x >> a.remove(x) >> print a 输出为: >> 1 >> [2] 然而,这里发生了一些奇怪的事情: 只打印了1,从列表中删除1后,程序似乎直接跳出循环。我的假设是,在更改列表

这里有一个简单的问题。我的任务是循环一个列表并打印它拥有的每个元素。在每次打印之后,我也打算从列表中删除这个元素。我的代码是:

>> a = [1,2]
>> for x in a:
>>   print x
>>   a.remove(x)
>>   print a
输出为:

>> 1
>> [2]
然而,这里发生了一些奇怪的事情: 只打印了1,从列表中删除1后,程序似乎直接跳出循环。我的假设是,在更改列表的内容之后,迭代器也可能会受到影响,但我不是很确定。更安全的方法是:

>> a = [1,2]
>> b = list(a)
>> for x in b:
>>   print x
>>   a.remove(x)
>>   print a

有人能给我提供更高级的解释吗?

您不应该从使用
迭代的列表中删除元素

您的猜测很接近——如果使用更长的列表,您可以更清楚地看到发生了什么:

a = [1,2,3,4,5]
for x in a:
    print x
    a.remove(x)
    print a
输出:

1
[2, 3, 4, 5]
3
[2, 4, 5]
5
[2, 4]
它打印索引0处的元素,然后是索引1,然后是索引2。。。到那时还没有指数3


在您的示例中,它在索引1处打印元素,然后没有索引2。

迭代器跟踪位置,是的。但是为什么要费心删除每个元素呢?您将得到一个空列表。
b=list(a)
创建列表的副本,因此
a
b
成为不同的对象。可能有用。有一个像样的解释。如果你想在修改列表时对列表进行迭代,请使用
while
循环,或者为
for
循环制作列表副本。可视化你的代码-
a = [1,2]
while a:
    print a.pop(0)
    print a