Python循环中绑定函数的正确方式及lambda闭包问题简易解法
解决Python循环批量绑定lambda时的迟绑定问题
你这段代码里,循环创建的lambda函数调用后都输出了1,而非预期的0和1,核心原因是lambda对变量i采用迟绑定——直到函数被调用时才会去读取i的当前值,而循环结束后i已经是1,所以所有lambda都使用了这个最终值。
下面是两种简易解决方法:
方法1:给lambda添加默认参数捕获当前值
修改循环内的lambda,通过默认参数i=i把当前循环的i值直接绑定到lambda内部,避免后续变量变化影响:
def cus_print(func): func() def main(): a = [] for i in range(2): # 添加默认参数捕获当前i的数值 a.append(lambda i=i: print(i)) for each in a: cus_print(each) if __name__ == '__main__': main()
运行结果:
0 1
方法2:使用functools.partial绑定参数
借助functools.partial工具,提前把print函数和当前循环的i值绑定,生成独立的绑定函数:
from functools import partial def cus_print(func): func() def main(): a = [] for i in range(2): # 绑定print的参数为当前循环的i a.append(partial(print, i)) for each in a: cus_print(each) if __name__ == '__main__': main()
运行结果:
0 1
内容的提问来源于stack exchange,提问作者SuiFengPiaoYang
相关产品推荐
相关产品推荐

