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

时间:2018-03-08 04:19:55

标签: 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并运行它。请帮我理解发生了什么。感谢

1 个答案:

答案 0 :(得分:2)

函数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)]