迭代时更改列表

时间:2016-10-21 15:20:48

标签: python

我发现了一个谜题,无法找出它的工作原理。

x = ['a','b','c']
for m in x:
     x.remove(m)

并在此循环x = ['b']之后。 但为什么?

据我所知for关键字隐式为此列表创建迭代器。 .remove()调用__next__()方法是否会跳过b?我无法找到它,但这是我最好的猜测。

1 个答案:

答案 0 :(得分:2)

在这里,您将遍历原始列表。在第一次迭代中,您删除了0th索引元素,即a。现在,您的列表为:['b','c']。在第二次迭代中,您的for循环将访问索引1处的值,但您的索引1的值为c。因此删除了c。因此,结果列表将是['b']

为了使其行为符合预期,迭代列表的副本,并从原始列表中删除该项目。例如:

x = ['a','b','c']
for m in list(x):  # <-- Here 'list(x)' will create the copy of list 'x'
                   # for will iterate over the copy
     x.remove(m)

# updated value of 'x' will be: []

注意:如果它不是用于演示目的而您使用此代码清空列表,则清空列表的有效方法是:

del x[:]