【问题标题】:zip variable empty after first use首次使用后 zip 变量为空
【发布时间】:2021-05-09 22:20:20
【问题描述】:

Python 3.2

t = (1, 2, 3)
t2 = (5, 6, 7)
z = zip(t, t2)

for x in z:
    print(x)

结果:

(1, 5)
(2, 6)
(3, 7)

之后立即放入完全相同的循环,什么都不会打印:

for x in z:
    print(x)

z 仍然作为<zip object at 0xa8d48ec> 存在。我什至可以重新分配 tt2 以再次压缩,但它只能工作一次,而且只能工作一次。

这是它应该如何工作的吗? the docs 中没有提及这一点。

【问题讨论】:

    标签: python python-3.x iterator


    【解决方案1】:

    zip 返回一个迭代器(在 Python 3 中)。您只能对迭代器进行一次迭代。迭代器在元素用完时不会消失,但再次迭代它会得到 0 个元素。如果您想要一份清单,请致电list

    z = list(zip(t, t2))
    

    【讨论】:

      【解决方案2】:

      因为zip 在 Python 3.x 中返回一个迭代器。如果您想重复使用它,请先将其设为list

      z = list(zip(t, t2))
      

      【讨论】:

        【解决方案3】:

        这就是它在 python 3.x 中的工作方式。在 python2.x 中,zip 返回了一个元组列表,但对于 python3.x,zip 的行为类似于itertools.izip 在 python2.x 中的行为。要恢复 python2.x 的行为,只需从 zip 的输出构造一个列表:

        z = list(zip(t,t2))
        

        请注意,在 python3.x 中,许多内置函数现在返回迭代器而不是列表(mapzipfilter

        【讨论】:

        • 参加聚会有点晚了,但这让我很难过。您不能回到迭代器的开头并且简单地使用 zip 具有可修改的效果,这似乎很疯狂。不容易理解,因为 Python 让人相信......
        • @NeilWalker -- 也许不是,但是 python 的迭代器启用的惰性迭代有很多非常好的好处(考虑任何类型的不可搜索的流数据)。与“一切都是列表”的世界观相比,您可以用很少的系统开销进行大量处理。
        猜你喜欢
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        相关资源
        最近更新 更多