在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并运行它。请帮我理解发生了什么。感谢
答案 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)]