如何基于索引值迭代定义独立函数,解决循环创建lambda时i绑定问题
问题原因
Python的闭包采用迟绑定机制:函数内部引用的外部变量,只会在函数实际被调用时才会取值,不会在函数定义时就捕获变量的当前值。你写的循环结束后变量i的最终值为2,因此所有函数被调用时都会使用这个最终值,导致三个函数表现完全一致。
修复方案
方案1:通过默认参数固定当前值(最简洁)
函数的默认参数会在函数定义阶段完成求值,因此可以把当前的i作为默认参数传入,直接把值固化到函数内部:
phi = [] # 如果你需要的是+1/+2/+3,range从1开始即可 for i in range(1, 4): phi.append(lambda x, i=i: x + i)
效果验证:
print(phi[0](0)) # 输出 1 print(phi[1](0)) # 输出 2 print(phi[2](0)) # 输出 3
方案2:使用functools.partial绑定参数
functools.partial可以在创建函数时就固定部分参数的取值,同样能实现和默认参数一样的绑定效果:
from functools import partial phi = [] for i in range(1, 4): phi.append(partial(lambda x, i: x + i, i=i))
方案3:通过函数工厂隔离作用域
额外定义一个返回函数的工厂函数,每次调用工厂函数时会生成独立的作用域保存当前的i值,避免共享外部循环的变量:
def create_add_func(i): return lambda x: x + i phi = [] for i in range(1, 4): phi.append(create_add_func(i))
内容的提问来源于stack exchange,提问作者Jackdaw
相关产品推荐
相关产品推荐

