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
相关产品推荐
相关产品推荐

