首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从生成器创建迭代器将返回相同的对象

从生成器创建迭代器将返回相同的对象
EN

Stack Overflow用户
提问于 2018-08-26 03:47:18
回答 1查看 116关注 0票数 3

假设我有一个很大的数据列表,我想要对其执行一些操作,并且我希望有多个迭代器独立地执行该操作。

代码语言:javascript
复制
data = [1,2,3,4,5]
generator = ((e, 2*e) for e in data)
it1 = iter(generator)
it2 = iter(generator)

我希望这些迭代器是不同的代码对象,但是it1 is it2返回True...更令人困惑的是,以下生成器也是如此:

代码语言:javascript
复制
# 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。

编辑:

我也尝试了以下几种方法:

代码语言:javascript
复制
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..。显然,生成器只是我想象中的一个更受约束的概念。

EN

回答 1

Stack Overflow用户

发布于 2018-08-26 04:02:55

您正在为两个iter使用相同的生成器。调用iter(thing)将返回对象的iter,因此,iter(生成器)在您两次调用它时都返回相同的对象。https://docs.python.org/3/library/stdtypes.html#generator-types

代码语言:javascript
复制
data = [1,2,3,4,5]
generator = ((e, 2*e) for e in data)
it1 = iter(generator)
it2 = iter(generator)

type(it1)
generator

这里有两种获得独特生成器的方法:

代码语言:javascript
复制
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

或者:

代码语言:javascript
复制
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

这两种解决方案都会产生以下结果:

代码语言:javascript
复制
next(it1)
(1, 2)
next(it2)
(1, 2)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52020719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档