假设我有一个很大的数据列表,我想要对其执行一些操作,并且我希望有多个迭代器独立地执行该操作。
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
..。显然,生成器只是我想象中的一个更受约束的概念。
发布于 2018-08-26 04:02:55
您正在为两个iter使用相同的生成器。调用iter(thing)
将返回对象的iter
,因此,iter(生成器)在您两次调用它时都返回相同的对象。https://docs.python.org/3/library/stdtypes.html#generator-types
data = [1,2,3,4,5]
generator = ((e, 2*e) for e in data)
it1 = iter(generator)
it2 = iter(generator)
type(it1)
generator
这里有两种获得独特生成器的方法:
import itertools
data = [1,2,3,4,5]
generator = ((e, 2*e) for e in data)
it1, it2 = itertools.tee(generator)
type(it1)
itertools._tee
或者:
data = [1,2,3,4,5]
it1 = ((e, 2*e) for e in data)
it2 = ((e, 2*e) for e in data)
type(it1)
generator
这两种解决方案都会产生以下结果:
next(it1)
(1, 2)
next(it2)
(1, 2)
https://stackoverflow.com/questions/52020719
复制相似问题