python for循环中zip对象的用法

时间:2019-03-29 01:22:53

标签: python for-loop zip

一个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对象本身?

非常感谢!

1 个答案:

答案 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循环没有必要进行迭代。