今天遇到一个很有趣的问题,关于python中zip的特性:
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'}
在创建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))
也可以证实这一点。
接下来我们修改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'}
我们再进一步,在代码片段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在被访问后元素自动删除的相关说明,恳请知道详情筒子们与我分享。先行谢过了!