为何itertools.permutations迭代器转列表取长度后会耗尽?
问题:为什么itertools.permutations对象转成列表取长度后会被耗尽?
案例1:itertools.permutations的情况
执行以下代码:
import itertools as itt perm_set = itt.permutations('ABC') iter1 = len(list(perm_set)) iter2 = len(list(perm_set)) print(iter1,iter2)
结果会输出 6 0,第3行执行后perm_set的数据被耗尽,导致iter1≠iter2。
案例2:普通列表的情况
执行以下代码:
l = [1,2,3,4,5] iter1 = len(list(l)) iter2 = len(list(l)) print(iter1,iter2)
结果会输出 5 5,两次取长度的结果完全一致。
原因解析
itt.permutations('ABC')返回的是迭代器(iterator),迭代器的核心特性是只能被遍历一次:当你用list(perm_set)遍历它时,会一次性取出所有元素生成列表,此时迭代器内部的"指针"已经走到末尾,没有剩余元素可生成。第二次调用list(perm_set)时,迭代器已经耗尽,只能得到空列表,长度自然为0。- 普通列表属于可迭代对象(iterable),但不是迭代器。每次调用
list(l)时,都会重新从列表的起始位置遍历所有元素,生成一个新的列表,完全不会改变原列表的状态,所以两次取长度的结果完全相同。
内容的提问来源于stack exchange,提问作者Sulek Levrone
相关产品推荐
相关产品推荐

