Python中map对象首次使用后被耗尽无法访问的原因是什么?
问题原因
Python 中 map() 函数返回的是迭代器对象,迭代器属于单次消耗的资源,内部会维护一个遍历指针,第一次遍历完成后指针会移动到末尾,后续再尝试遍历的时候不会返回任何元素。
你代码中第一次调用 list(m) 时,已经完整遍历了map迭代器的所有元素,将迭代器完全耗尽,第二次调用 list(m) 自然只能得到空列表,所以low函数拿到空列表后返回None,和你的实际输出一致。
特性说明
Python 迭代器遵循标准迭代协议:每次调用__next__()方法返回下一个元素,所有元素返回完毕后会持续抛出StopIteration异常,不会重置指针。除了map之外,filter、生成器表达式、zip等内置方法返回的都是迭代器,都具备相同的单次消耗特性。
解决方法
如果需要多次使用map的计算结果,直接在创建后转换为列表/元组这类可重复遍历的序列类型存储即可,优化后的代码示例如下:
def concat(n): return n + "abc" def upp(Lst): for i in Lst: if i[0].isupper(): return i def low(Lst): for i in Lst: if i[0].islower(): return i # main L = ["a","B","c"] # 转换为列表存储,后续可重复使用 m = list(map(concat, L)) print(f"Capitalised string: {upp(m)} lowercased string: {low(m)}")
运行后即可得到你预期的输出:
Capitalised string: Babc lowercased string: aabc
内容的提问来源于stack exchange,提问作者Sapt-Programmer
相关产品推荐
相关产品推荐

