它是安全的动态改变迭代器在Python?(Is it safe to change the iter

2019-10-18 11:55发布

与Python,我需要在动态当列表遍历一个列表中添加成员:

i = [1,2,3,4,5]

for a in i:
    if a == 1:
        i.append(100)
    print a

难道是保证正常工作?

Answer 1:

要更改顺序,而不是迭代器。 该for循环调用iter()你遍历对象上,创建一个循环迭代。 对于一个list对象,创建的列表迭代器保存每个时间到原来的列表的引用和内部指标, for循环要求下一个项目(调用next()对迭代器),则返回当前索引处的项和索引递增。

这种情况下,它是安全的,因为循环迭代对象会很乐意继续在额外的项目。 只要你不将项目添加到i无止境,循环将完成。

如果你是从删除项目i ,但是,将循环迭代不会看到这些变化,你会得到“令人吃惊”的结果:

i = [1, 2, 3, 4, 5]
for a in i:
   if a == 1:
       del i[0]
   print a

打印:

1
3
4
5

因为循环迭代产量i[1]上的下一次迭代,这是现在3 ,而不是2

如果你插入当前迭代指数前项目将出现类似的问题。

您可以创建自己的迭代器,并手动实验,看看会发生什么:

>>> i = [1, 2, 3, 4, 5]
>>> i_iter = iter(i)  # index starts at 0
>>> next(i_iter)      # now the index is 1
1
>>> del i[0]
>>> i
[2, 3, 4, 5]          # item at index 1 is 3
>>> next(i_iter)      # returns 3, next index is 2
3
>>> i.insert(0, 1)
>>> i
[1, 2, 3, 4, 5]       # item at index 2 is 3
>>> next(i_iter)      # returns 3, next index is 3
3


文章来源: Is it safe to change the iterator dynamically in python?