gpt4 book ai didi

python - 在 python 中动态更改迭代器是否安全?

转载 作者:行者123 更新时间:2023-12-05 01:48:07 26 4
gpt4 key购买 nike

使用 python,我需要在遍历列表时动态地在列表中添加成员:

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

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

它能保证正常工作吗?

最佳答案

您正在更改序列,而不是迭代器。 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

关于python - 在 python 中动态更改迭代器是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18254038/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com