为什么zip在初次使用后没有退货?

时间:2018-03-29 15:37:17

标签: python python-3.x type-conversion

在下面的代码中我想要测试zip()方法。在一个例子中,我迭代b(zip输出),第二个转换b到set.but当我转换b设置奇怪的事情发生。在b中迭代的那些,打印输出是空列表。但是当我评论c = set(b)print(c)输出是否正确时会发生什么?为什么?你能帮我解释一下吗?

    l1 = range(10)
    l2 = range(10)
    b = zip(l1,l2)
    c = set(b)
    print(c)
    result = [(x,y) for x,y in b]
    print(len(result))

1 个答案:

答案 0 :(得分:1)

zip是一个耗尽的迭代器。

根据documentationzip相当于下面的生成器函数(请注意yield语句):

def zip(*iterables):
    # zip('ABCD', 'xy') --> Ax By
    sentinel = object()
    iterators = [iter(it) for it in iterables]
    while iterators:
        result = []
        for it in iterators:
            elem = next(it, sentinel)
            if elem is sentinel:
                return
            result.append(elem)
        yield tuple(result)

您可以通过多种方式耗尽发电机。例如,通过在其上调用listset,或者应用next直到它耗尽。

由于您已在生成器上调用set,因此其内容已清空且不再可迭代,除非它们已通过耗尽函数存储。

您可以在exhausted iterators - what to do about them?中找到一些示例和解决方案。特别是,itertools.tee可以方便地复制迭代器,以便您可以“重用”它。