【问题标题】:Python making multiple zip objects will overwrite the first one [duplicate]Python制作多个zip对象将覆盖第一个[重复]
【发布时间】:2020-09-21 06:26:56
【问题描述】:

当我遇到这个非常奇怪的错误时,我正在做一个项目,我已经设法将其缩减为:

xr = zip(range(0, 5), range(0, 5))
yr = zip(range(3, 4), range(0, 1))

print(list(xr), list(yr))
print(list(xr))

预期的输出是这样的:

[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)] [(3, 0)]
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

因为我在设置 xr 或 yr 后不会更改它们。我只是将它们作为列表打印到 shell 中。但是,当我实际运行它时,我得到了这个输出:

[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)] [(3, 0)]
[]

我完全不知道为什么。我已经使用 python 大约一个星期了,也许这应该发生,但如果有人告诉我这里发生了什么,我将不胜感激。谢谢!

我的 python 版本是 Python 3.8.3

【问题讨论】:

    标签: python python-3.x for-loop debugging range


    【解决方案1】:

    那是因为你正在耗尽迭代器。

    使用这个:

    xr = list(zip(range(0, 5), range(0, 5)))
    yr = list(zip(range(3, 4), range(0, 1)))
    
    print(xr, yr)
    print(xr)
    

    【讨论】:

    • “耗尽发电机”是什么意思?有什么可以参考的吗?
    • iterator 遍历后耗尽。您的使用需要多次使用结果。所以,把它变成一个列表。
    • 此解决方案完美运行!我不知道迭代器如何只能使用一次,所以谢谢!
    【解决方案2】:

    zip 函数创建一个迭代器对象,该对象只能被使用一次。这个post 解释了为什么你不能对数据进行两次迭代。

    这个document 解释了迭代器类。

    【讨论】:

    • 这是有道理的。谢谢!
    猜你喜欢
    • 2019-09-03
    • 1970-01-01
    • 2016-03-07
    • 2021-07-12
    • 2018-01-20
    • 1970-01-01
    • 2010-12-02
    • 2021-09-12
    相关资源
    最近更新 更多