【问题标题】:How to create a copy of python iterator? [duplicate]如何创建python迭代器的副本? [复制]
【发布时间】:2017-06-27 05:28:56
【问题描述】:

在 python 中,我尝试使用赋值创建我的迭代器的副本,但是它创建了一个引用原始迭代器本身的迭代器的副本。例如:

my_list = [5, 4, 3,2]
first_it = iter(my_list)
second_it = first_it 
print next(first_it )        #it will print 5
print next(second_it)        #it will print 4
print next(first_it )        #it will print 3

正如您在示例中看到的 first_it 和 second_it 都引用同一个迭代器对象。是否可以创建不引用原始对象的迭代器对象的副本?

注意 这个问题是关于如何按值创建迭代器对象的副本。所以不要提for item in my_list:之类的解决方案。
在此先感谢

【问题讨论】:

    标签: python python-2.7 python-3.x iterator


    【解决方案1】:

    使用itertools.tee() function 制作副本;它们使用缓冲区在不同的迭代器之间共享结果:

    from itertools import tee
    
    my_list = [5, 4, 3,2]
    first_it = iter(my_list)
    first_it, second_it = tee(first_it)
    print next(first_it)   # prints 5
    print next(second_it)  # prints 5
    print next(first_it)   # prints 4
    

    请注意,您不应再使用原来的迭代器;只使用 T 恤。

    请注意,缓冲区还意味着,如果您将其中一个副本远远提前于其他副本,这些可能会产生大量内存成本!来自文档:

    此迭代工具可能需要大量辅助存储(取决于需要存储多少临时数据)。一般来说,如果一个迭代器在另一个迭代器启动之前使用了大部分或全部数据,那么使用list() 而不是tee() 会更快。

    【讨论】:

    • 我试过copy.copy(),它也有效。也许有一个隐藏的陷阱?
    • @Jean-FrançoisFabre:这不适用于发电机。例如,尝试使用使用 while True: yield random.random() 的生成器。
    • 可能与:“你不能腌制发电机”有关。
    • @Jean-FrançoisFabre:仅仅因为 some 迭代器对象是可复制的,并不意味着它们都是可复制的。该示例生成一个list_iterator() 对象,它只需要存储对原始列表对象的引用和当前位置。这很容易复制。但是对于一个无限的随机生成器来说,没有“当前位置”,只有接下来可能会产生另一个值的东西。
    猜你喜欢
    • 2011-08-23
    • 2017-01-14
    • 2012-11-10
    • 2014-08-26
    • 2015-01-01
    • 2020-12-05
    • 1970-01-01
    • 2011-09-05
    • 2018-05-20
    相关资源
    最近更新 更多