You need to enable JavaScript to run this app. Python中lambda定义函数列表的异常行为与打印结果差异原因问询
优惠活动
大模型
产品
解决方案
定价
更多

Python中lambda定义函数列表的异常行为与打印结果差异原因问询

两段打印输出差异的底层原因

第一组打印的正常执行逻辑

第一行打印语句遍历原列表f的过程不存在变量引用绑定问题:

  • 遍历f时直接取出列表存储的两个独立lambda对象,分别传入参数2计算
  • 第一个lambda执行2**2得到4,第二个lambda执行2+100得到102,最终输出[4, 102]

第二组打印输出异常的核心:Python闭包的延迟绑定规则

Python中,所有引用外层作用域变量的函数(包括lambda表达式),不会在函数定义阶段就锁定引用变量的值,只会在函数实际被调用的时刻,才去对应外层作用域查找该变量的最终值。
对应到f_new的生成过程:

f_new = [lambda x: fi(x) for fi in f]
  1. 列表推导式执行时,会在当前作用域声明一个临时变量fi,依次把f中的两个lambda赋值给fi,每完成一次赋值就生成一个内部lambda(逻辑为“调用fi(x)”)存入f_new
  2. 这两个内部lambda里引用的fi,并不是定义时拿到的临时值,而是直接指向当前作用域的变量名fi
  3. 整个列表推导式执行完毕后,fi变量在当前作用域的最终值,是原列表f的最后一个元素:即lambda x: x+100
  4. 后续执行[fi(2) for fi in f_new]时,两个存到f_new里的函数被调用,它们内部都会查找fi的当前值——也就是最后那个做加法的lambda,两次计算都会执行2+100,最终输出[102, 102]

常见规避方式

如果需要在定义阶段就把引用的外层变量固定为当前值,可以利用Python函数默认参数在定义时就求值的特性,给lambda增加默认值绑定:

# 改写后即可得到预期的[4, 102]输出
f_new = [lambda x, fi=fi: fi(x) for fi in f]

内容的提问来源于stack exchange,提问作者Max Alekseyev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 06:15:01