【发布时间】:2018-08-25 19:47:17
【问题描述】:
假设我有一个庞大的数据列表,我想对其执行一些操作,并且我想让多个迭代器独立地执行此操作。
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)BUT "一旦tee()进行了拆分,则不应在其他任何地方使用原始迭代;否则,迭代可能会在不通知 tee 对象的情况下前进。此迭代工具可能需要大量的辅助存储(取决于需要存储多少临时数据)。通常,如果一个迭代器在另一个迭代器启动之前使用了大部分或全部数据,则使用list()而不是tee()更快。 " -
更好:
g1, g2 = ((e, 2*e) for e in data), ((e, 2*e) for e in data)(但这只有在data是一个序列时才有效——它不能是一个迭代器。)