You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法,不会重新生成字典。

依据说明

  1. Python官方文档定义

map(function, iterable, ...) 返回一个迭代器,它会将 function 应用于 iterable 的每个元素,生成结果。其中传入的function参数会在调用map时被完整求值,之后迭代过程中直接使用这个已确定的函数对象,不会每次迭代都重新计算function参数的表达式。

  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:12:35