使用python,我需要在迭代列表时动态地在列表中添加成员:
i = [1,2,3,4,5]
for a in i:
if a == 1:
i.append(100)
print a
是否可以保证正常工作?
答案 0 :(得分:3)
您正在更改序列,而不是迭代器。 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