python中的zip元素在访问后会被自动删除吗?

今天遇到一个很有趣的问题,关于python中zip的特性:

代码片段1:
lowerCase=['a','b','c']
upperCase=['A','B','B']

zipped=zip(lowerCase,upperCase)
dict1=dict(zipped)
print('Dict: ', dict1)

# 从输看,目前一切正常
# Dict:  {'a': 'A', 'b': 'B', 'c': 'B'}
代码片段2:

在创建dict1之前,先访问zipped一次

lowerCase=['a','b','c']
upperCase=['A','B','B']

zipped=zip(lowerCase,upperCase)
print([x for x in zipped]) #在创建dict1之前对zipped访问一次
dict1=dict(zipped)
print('Dict: ', dict1)

# 怪了,dict1变成了空字典
# [('a', 'A'), ('b', 'B'), ('c', 'B')]
# Dict:  {}

我们直到zip函数的返回值,在python2中是list类型,在python3中是zip类型,在python3中用

print(type(zipped))

也可以证实这一点。

代码片段3:

接下来我们修改zipped的创建方式,在生成时就直接转为数组

lowerCase=['a','b','c']
upperCase=['A','B','B']

zipped=list(zip(lowerCase,upperCase)) #直接转成list
print([x for x in zipped]) # 无论加不加这一行,结果都一致了
dict1=dict(zipped)
print('Dict: ', dict1)

# 恢复正常了
# Dict:  {'a': 'A', 'b': 'B', 'c': 'B'}
代码片段4:

我们再进一步,在代码片段2的基础上,再访问zipped一次看看会发生什么

lowerCase=['a','b','c']
upperCase=['A','B','B']

zipped=zip(lowerCase,upperCase)
print([x for x in zipped])
print([x for x in zipped])

# [('a', 'A'), ('b', 'B'), ('c', 'B')]
# []

哇哦!zip类型被访问后,元素真的没了!!!

总结和求助

经验教训就是:使用zip要谨慎,最好在使用zip函数时,直接把它转成我们熟悉的list。
我没有查到关于zip在被访问后元素自动删除的相关说明,恳请知道详情筒子们与我分享。先行谢过了!


版权声明:本文为fm0517原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。