enumerate()
返回一个迭代器,其他调用也是如此。您只能循环遍历一个迭代器;然后用尽。
您可以使用生成器函数自己创建这样的迭代器:
def somelist_generator():
somelist = [1, 2, 3]
while somelist:
yield somelist.pop()
如果你要循环somelist_generator()
,列表somelist
将被清空。你只能这样做一次,因为.pop()
删除元素:
>>> it = somelist_generator()
>>> for i in it:
... print(i)
...
3
2
1
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
该next()
调用尝试从it
迭代器中获取另一个值;它已经是空的,因此StopIteration
引发了异常。该异常表明没有更多元素要获取,这就是为什么您第二次尝试从迭代器获取任何内容时最终得到一个空列表的原因:
>>> list(it)
[]
range()
不返回迭代器。相反,它返回一个范围对象,该对象代表一个内存有效的数字序列;只需要存储开始、结束和步幅,其他所有内容都可以从这 3 个点得出。