考虑一下(Python3.3):
a=enumerate([2,3,5])
print(list(a))
print(list(a))
你真的希望两个打印调用打印不同的东西吗?
我也没有
如果用set
、tuple
或dict
替换list,也会发生同样的情况。如果将enumerate
对象替换为map
或filter
,也会发生这种情况,但奇怪的是,如果将其替换为range
,则不会发生这种情况。你知道吗
也许这是一个特征。但这是非常令人惊讶的,没有记录在案(至少我还没有找到任何关于它),而且不一致(范围不同)。你怎么认为?你知道吗
Tags:
enumerate()
返回迭代器,其他调用也是如此。。您只能循环遍历迭代器一次;然后它就被耗尽了。你知道吗您可以使用生成器函数自己创建这样的迭代器:
如果在
somelist_generator()
上循环,列表somelist
将被清空。您只能这样做一次,因为.pop()
会删除元素:next()
调用尝试从it
迭代器获取另一个值;它已经为空,因此引发了StopIteration
异常。这个异常表示没有更多的元素可以获取,这就是为什么第二次尝试从迭代器获取任何内容时,最终会得到一个空列表:range()
不返回迭代器。它返回一个range object,它表示一个内存效率很高的数字序列;只需要存储开始、结束和步幅,其他所有内容都可以从这3个点派生出来。你知道吗行为记录在http://docs.python.org/3/glossary.html#term-iterator
相关问题 更多 >
编程相关推荐