一个zip对象是否仅可作为对象本身用于for循环?
我希望我能得到一些解释,为什么当实际上是同一回事时却不能使用其他类型(如变量,列表)。
x = [1, 2, 3]
y = ['a', 'b', 'c']
obj1 = zip(x, y)
odj2 = list(zip(x, y))
# working properly
for a, b in zip(x, y):
print(a)
print(b)
# doesn't work and don't know why
for a, b in obj1:
print(a)
print(b)
for a, b in obj2:
print(a)
print(b)
那么,我是否必须在for循环中使用带有zip功能的zip对象本身?
非常感谢!
答案 0 :(得分:0)
如果从头开始运行提供的代码,则可以正常工作(除了odj2
应该为obj2
之外)。
您感到困惑的原因是zip
对象是 iterator 。它不将元素存储在内存中,而是根据需要动态生成它们。您无法访问先前的元素或重新启动迭代器;相反,您必须构建一个新的。因此,如果发现自己需要多次遍历这些序列,则应将它们转换为持久性数据结构,例如lists
。例如:
x = [1, 2, 3]
y = ['a', 'b', 'c']
zip_object = zip(x, y)
print('first time:')
for first, second in zip_object:
print(first, second)
print('second time:')
for first, second in zip_object:
print(first, second)
print('done')
输出:
first time
1 a
2 b
3 c
second time
done
将此与使用zip
对象创建list
的情况进行对比:
zip_object = zip(x, y)
new_list = list(zip_object)
print('first time:')
for first, second in new_list:
print(first, second)
print('second time:')
for first, second in new_list:
print(first, second)
print('going back to the zip object')
for first, second in zip_object:
print(first, second)
print('done')
输出:
first time
1 a
2 b
3 c
second time
1 a
2 b
3 c
going back to the zip object
done
发生的事情是,您迭代了某个地方的obj1
,然后又没有创建新的zip
对象,而是试图再次迭代它。由于它已经被完全耗尽,因此for
循环没有必要进行迭代。