使用enumerate的for循环意外终止,原因是什么?
为什么遍历enumerate对象时,转成list会导致循环意外终止?
这事儿的核心原因很简单:enumerate()返回的是一个迭代器(iterator),而不是像列表那样可以重复遍历的序列。迭代器有个关键特性:它的元素只能被取一次,一旦被耗尽,就再也拿不出新元素了。
咱们拆解下你的代码执行流程:
- 首先
enum_arr = enumerate(arr)创建了一个迭代器,此时它还没生成任何元素。 - 进入for循环,第一次迭代取出第一个元素
(0, 0)并打印。 - 接下来执行
print(list(enum_arr)[ele[0]:]):list(enum_arr)会一次性把迭代器中剩余的所有元素(也就是(1,1)到(5,5))全部取出来转成列表。这一步直接把enum_arr这个迭代器彻底耗尽了——里面再也没有任何未取出的元素了。 - 当for循环准备进行下一次迭代,尝试从
enum_arr取元素时,发现迭代器已经空了,循环自然就终止了。
而当你注释掉那行print(list(...))的代码时,for循环每次只从迭代器中取出一个元素,迭代器会逐步推进,直到所有元素都被遍历完,所以输出就符合预期了。
怎么避免这种问题?
如果你需要多次使用enumerate的结果,提前把它转成列表存起来就行:
arr = [0,1,2,3,4,5] enum_arr = list(enumerate(arr)) # 先转成列表,可重复遍历 for ele in enum_arr: print(ele) print(enum_arr[ele[0]:]) # 现在用的是列表切片,不会消耗迭代器
这样执行后,循环就能正常遍历所有元素,同时也能输出对应的切片内容。
内容的提问来源于stack exchange,提问作者Sharvari Gc
相关产品推荐
相关产品推荐

