为什么Python中对同一个zip对象第二次转列表会得到空列表
原因说明
Python 3 中 zip() 函数返回的是迭代器对象,而非预先生成的列表,该特性是产生此现象的核心原因,具体逻辑如下:
- 迭代器属于消耗式的单向遍历对象,内部元素只能被顺序读取一次,遍历完成后迭代器就会被耗尽,不会留存任何元素。
- 第一次执行
list(result)时,程序会完整遍历result这个zip迭代器的所有配对元素,将其全部转换成列表元素存入result_list,此时result迭代器已经没有剩余元素可供读取。 - 第二次执行
list(result)时,程序会从已经耗尽的迭代器末尾尝试读取元素,自然读不到任何内容,最终得到空列表。
解决方案
如果需要多次使用zip配对后的结果,直接在第一次生成时就转为列表存储,后续复用这个列表即可:
number_list = [1,2,3] str_list = ['one','two','three'] # 生成配对结果后直接转列表留存 result_list = list(zip(number_list, str_list)) # 后续需要多份的话直接复制列表,不需要直接复用result_list即可 result_list2 = result_list.copy() print(result_list) print(result_list2)
运行后两次输出就会一致:
[(1, 'one'), (2, 'two'), (3, 'three')] [(1, 'one'), (2, 'two'), (3, 'three')]
内容的提问来源于stack exchange,提问作者Asir Shahriar Roudra
相关产品推荐
相关产品推荐

