Python连续两次对map对象调用list()第二次返回空列表问题
问题原因
Python 3 环境下map()的返回值是迭代器对象,而非Python 2版本中直接返回的预计算列表,这是两次调用list()结果不一致的核心原因。
迭代器遵循惰性计算、单次遍历的规则:创建map对象时不会立刻执行float转换生成所有结果,只有主动迭代取值时才会逐个计算并返回下一个元素;当所有元素被遍历完成后,迭代器会进入耗尽状态,后续再迭代不会返回任何值。
对应你的测试代码逻辑:
a=map(float, [1,2,3]) list(a) #first list(a) #second
- 第一次执行
list(a)时,解释器会完整遍历a指向的map迭代器,依次取出转换后的1.0、2.0、3.0拼接为列表,此时迭代器内的所有元素已经被取完。 - 第二次执行
list(a)时,迭代器已经没有剩余元素可供读取,因此直接返回空列表[]。
解决方法
如果需要多次使用转换后的列表,只需要在第一次转换时将结果赋值给变量持久化存储即可:
a = map(float, [1,2,3]) float_list = list(a) # 后续多次调用float_list都能拿到完整结果 print(float_list) # 输出 [1.0, 2.0, 3.0] print(float_list) # 输出 [1.0, 2.0, 3.0]
注意:除了
map之外,Python 3中的filter、zip、生成器表达式返回的也都是迭代器对象,均存在遍历一次即耗尽的特性,遇到同类二次取值为空的问题可以优先从这个角度排查。
内容的提问来源于stack exchange,提问作者funpy
相关产品推荐
相关产品推荐

