Python的map函数是否惰性求值?字典参数会重复计算吗?
关于Python中map函数参数求值时机的疑问解答
我在解决LeetCode 1331. Rank Transform of an Array题目时,写出了如下一行代码解决方案:
class Solution: def arrayRankTransform(self): return map({e: i for i, e in enumerate(sorted(set(arr)), 1)}.get, arr)
该代码先生成替换字典,再通过map函数结合字典的get方法转换数组,类似str的translate方法。我的疑问是:这个替换字典是在遍历元素前仅计算一次,还是会为每个元素重新计算?换句话说,map函数是在迭代前存储传入的函数,还是会为每个元素重新求值该函数?
结论
替换字典仅会在调用map函数时计算一次,之后map迭代arr元素的过程中,只会重复使用字典的get方法,不会重新生成字典。
依据说明
- Python官方文档定义
map(function, iterable, ...) 返回一个迭代器,它会将 function 应用于 iterable 的每个元素,生成结果。其中传入的
function参数会在调用map时被完整求值,之后迭代过程中直接使用这个已确定的函数对象,不会每次迭代都重新计算function参数的表达式。
- CPython源码验证
在CPython的Objects/mapobject.c实现中,map对象的结构体PyMapObject会保存初始化时传入的func指针:
typedef struct { PyObject_HEAD PyObject *func; PyObject *iter; PyObject *sentinel; PyObject *args; PyObject *kwds; } PyMapObject;
当创建map对象时,会先对传入的function参数进行求值并保存到func字段中,后续每次迭代元素时,直接调用这个已保存的函数对象,不会重新执行生成function的表达式。
内容的提问来源于stack exchange,提问作者diduk001
相关产品推荐
相关产品推荐

