python - 为什么x的内容消失了。关于 python 中正确性的推理?

标签 python python-3.x loops memory

<分区>

在用 Python 编写一些简单的脚本时,我注意到了一些奇怪的事情。看看

>>> x=zip((1,2),(3,4))
>>> for i in x:
...     print(x)
...
<zip object at 0x00000284D034F248>
<zip object at 0x00000284D034F248>
>>> for i in x:
...     for k in i:
...             print(k)
...
>>> for i in x:
...     print(x)
...
>>> x=zip((1,2),(3,4))
>>> for i in x:
...     for k in i:
...             print(k)

1
3
2
4

当我在第一个循环中打印 x 时,我得到了 2 个 zip 对象,正如预期的那样。但是在第二眼中我什么也没有得到,然后我再次运行第一个循环仍然什么也没有得到,x 发生了什么?

然后,为了确保第二个循环确实有效,我重新定义了 x 并运行了它。请帮助我了解发生了什么。谢谢

最佳答案

zip 函数返回一个迭代器。这意味着当您对其进行迭代时,您会消耗它。

您可以使用 next 查看这是如何发生的。

x = zip((1,2),(3,4))

next(x) # (1, 3)
next(x) # (2, 4)

next(x) # raises a StopIteration error

因此,当您第一次遍历 x 时,您会完全使用它。当你第二次遍历 x 时,没有更多的东西可以迭代了。

这是此行为的另一个示例,循环仅部分使用 zip 对象。

x = zip((1, 2, 3),(4, 5, 6))

for y in x:
    print('In first loop:', y)
    break

for y in x:
    print('In second loop:', y)

这将打印以下内容。

In first loop: (1, 4)
In second loop: (2, 5)
In second loop: (3, 6)

如果您不想要这种行为,您可以将 zip 对象转换为 list

x = list(zip((1, 2), (3, 4))) # [(1, 3), (2, 4)]

关于python - 为什么x的内容消失了。关于 python 中正确性的推理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49165370/

相关文章:

java - do-while 循环问题

python - 使用 Python For 循环保存来自多个坐标的输出距离

python - 检测线程何时在 python 应用程序中运行?

python - flake8 e999 在 python2 中使用 fstrings (使用 future_fstrings)

python-3.x - 有人可以帮我吗。我在用Python编写此代码时遇到问题

python - 使用 BeautifulSoup 抓取网站时出现字符编码问题

postgresql - pg_terminate_backend 在循环中不起作用

python - 保存我多次使用的列表的长度是否更好?

python - 用两个不同的分隔符拆分字符串,将两个单词大写,只包含分隔符,然后再添加两个分隔符的最佳方法是什么?

python - PyPI:上传新版本时模块代码不会更新