我曾经认为python中的for-loop像这样它首先通过iter(iterable)
进行迭代然后next(that_new_iterator_object)
当它升高StopIteration
时,for-loop结束并转到else
块(如果提供)但这里的工作方式有所不同
>>> a = [1,2,3,4,5,6,7,8,9]
>>> for i in a:
del a[-1]
print(i)
1
2
3
4
5
其他数字在哪里6,7,8,9for循环创建的新迭代器对象与变量a不同
您正在缩短每次迭代的列表,当迭代器用完5个项目时,迭代器将退出。
(也就是说,在迭代过程中对一个可迭代对象进行突变不是一个好习惯;如果您这样做,dict
会直接抱怨。)
for循环的工作与您描述的一样。但是,以下是[[list iterator的工作原理:
class ListIterator:
def __init__(self, lst):
self.lst = lst
self.idx = 0
def __iter__(self):
return self
def __next__(self):
if self.idx >= len(self.lst):
raise StopIteration
else:
val = self.lst[self.idx]
self.idx += 1
return val
IOW,迭代器取决于您要修改的列表。