为何调用函数后reversed迭代器会变为空?
关于Python迭代器一次性遍历的问题解释
先看你写的第一段代码:
nums = [4, 1, 3, 2] rev = reversed(nums) rev2 = list(rev) print(list(rev)) print(rev2)
运行结果:
[] [2, 3, 1, 4]
你发现调用list()后rev迭代器就没有元素了,而且自定义函数里也会出现同样的情况:
def become_list(iter): result = [] for i in iter: result.append(i) return result nums = [4, 1, 3, 2] rev = reversed(nums) rev2 = become_list(rev) print(list(rev)) print(rev2)
运行结果:
[] [2, 3, 1, 4]
原因解释
这是因为reversed()返回的是迭代器对象,迭代器的核心设计就是只能被遍历一次。它内部有一个类似指针的标记,每次获取元素时,指针就会向后移动一位,直到所有元素都被取完,指针就停在末尾,再也没有元素可以返回。
不管是用list()转换迭代器,还是自定义函数里用for循环遍历,本质都是把迭代器里的元素从头到尾取了一遍,这个操作完成后,迭代器就被"耗尽"了,再去调用list()或者再次遍历,自然只能得到空列表。
再看你测试的这段代码:
nums = [4, 1, 3, 2] rev = reversed(nums) print(sorted(rev) == sorted(rev))
输出为False的原因也一样:第一次调用sorted(rev)时,已经把rev里的所有元素取出来排序,得到[1, 2, 3, 4],此时rev已经被耗尽;第二次调用sorted(rev)时,迭代器里没有元素,排序后得到空列表[],两个结果不相等,所以输出False。
内容的提问来源于stack exchange,提问作者Fontanez
相关产品推荐
相关产品推荐

