假设我有一个大型数据列表,我想对其执行某些操作,并且我希望有多个迭代器独立执行此操作。
我预期这些迭代器应该是不同的代码对象,但是
data = [1,2,3,4,5]
generator = ((e, 2*e) for e in data)
it1 = iter(generator)
it2 = iter(generator)
我预期这些迭代器应该是不同的代码对象,但是
it1 is it2
返回了 True
... 更加令人困惑的是,对于以下的生成器也是如此:# copied data
gen = ((e, 2*e) for e in copy.deepcopy(data))
# temp object
gen = ((e, 2*e) for e in [1,2,3,4,5])
实际上这意味着当我调用 next(it1)
时,it2
也会被增加,而这不是我想要的行为。
这里发生了什么?有没有办法做到我想做的事情?我在Ubuntu 14.04上使用Python 2.7。
编辑:
我还尝试了以下代码:
gen = (e for e in [1,2,3,4,5])
it = iter(gen)
next(it)
next(it)
for e in gen:
print e
打印出3 4 5
...看来生成器只是一个比我想象中更受限的概念。
it1, it2 = itertools.tee(generator)
的意思是:将generator
生成器拆分成两个迭代器it1
和it2
。但需要注意,一旦使用tee()
进行拆分后,原始可迭代对象不应在其他地方使用,否则可迭代对象可能会被提前进行遍历,而不通知tee对象。此迭代工具可能需要大量辅助存储(取决于需要存储多少临时数据)。一般来说,如果一个迭代器在另一个迭代器开始之前使用了大部分或全部数据,则使用list()
而不是tee()
更快。 - Steven Rumbalskig1, g2 = ((e, 2*e) for e in data), ((e, 2*e) for e in data)
(但这只适用于data
是一个序列,不能是迭代器)。 - Steven Rumbalski