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

Python 2.7下如何生成各带不同默认参数的函数列表?

解决Python 2.7循环创建lambda时默认参数绑定的问题

这个问题我太熟了!你遇到的是Python闭包中变量延迟绑定的经典坑——lambda里引用的i并不是循环迭代时的即时值,而是直到函数被调用时才会去读取i的当前值。等循环全部结束后,i已经变成了9,所以所有lambda调用时都会返回9+x的结果。

下面给你两种简单可行的修改方案,完全不需要大规模改动现有代码:

方案1:给lambda添加默认参数绑定当前值

通过给lambda增加一个带有默认值的参数,让循环时的i值在lambda定义时就被固定下来:

function_list = []
for i in range(10):
    # 新增默认参数a=i,将当前循环的i值绑定到lambda内部
    function_list.append(lambda x, a=i: myfunc(a, x))
def myfunc(a,b):
    print a + b

原理:Python函数的默认参数是在函数定义阶段就完成赋值的,所以每次循环都会把当时的i值存入a参数,后续i的变化不会影响已经绑定好的lambda。

方案2:使用functools.partial固定参数

Python 2.7自带的functools.partial可以帮我们预绑定函数的部分参数,生成新的函数:

from functools import partial

function_list = []
for i in range(10):
    # 将myfunc的第一个参数固定为当前的i,生成新函数加入列表
    function_list.append(partial(myfunc, i))
def myfunc(a,b):
    print a + b

原理:partial会创建一个新的可调用对象,把指定的参数(这里是i)固定为myfunc的第一个参数,后续调用这个新函数时只需要传入x即可,每个新函数都绑定了循环时对应的i值。

这两种方案都能完美解决你的问题,而且只需要修改循环内的append语句,完全符合你“无法大规模修改现有代码”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:20:38