微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

映射与初始迭代器共享当前状态产生的 Python + 迭代器

如何解决映射与初始迭代器共享当前状态产生的 Python + 迭代器

让我用我的学生遇到的一个例子来说明这一点:

>>>a_lot = (i for i in range(10e50))
>>>twice_a_lot = map(lambda x: 2*x,a_lot)
>>>next(a_lot)
0
>>>next(a_lot)
1
>>>next(a_lot)
2
>>>next(twice_a_lot)
6

所以不知何故,这些迭代器共享他们当前的状态,听起来很疯狂和不舒服...... 任何关于 python 在幕后使用的模型的提示

解决方法

这乍一看可能会令人惊讶,但仔细想想,这应该是显而易见的。

当您从另一个迭代器创建迭代器时,无法在您迭代的任何底层容器(在本例中为 range 对象)上恢复原始状态。至少一般不会。

考虑最简单的情况:iter(something)

something 是迭代器时,则根据 iterator protocol specificationiterator.__iter__ 必须:

返回迭代器对象本身

换句话说,如果您正确实施了协议,那么以下身份将始终成立:

iter(iterator) is iterator

当然,map 可以有一些约定,允许它恢复并创建一个独立迭代器,但没有这样的约定。一般来说,如果要创建独立的迭代器,则需要从源头创建。

当然,有些迭代器在不存储所有以前的结果的情况下确实不可能做到这一点。考虑:

import random

def random_iterator():
    while True:
        yield random.random()

在这种情况下,应该如何映射函数与以下内容?

iterator = random_iterator()
twice = map(lambda x: x*2,iterator)
,

好的,感谢收到的所有评论(不到 5 分钟!!!!)我明白了相关的事情:如果我想要两个独立的迭代器,我不会使用 map 从 fst 计算 snd :

>>>a_lot = (i for i in range(10e50))
>>>twice_a_lot = (2*i for i in range(10e50))

而且我会记住 map 是懒惰的,因为没有其他方法可以说得通。 那是一堂很好的SO课。

THX

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。