Python创建带初始化参数的函数指针列表并正确调用
问题
运行以下Python代码时,所有lambda函数都会打印4,但期望每个函数打印其创建时对应的i值(即依次输出0、1、2、3、4),该需求用于大型多线程项目的蓝图实现:
def foo(stuff): print(stuff) fun_list = [lambda :foo(i) for i in range(5)] for fun in fun_list: fun()
解决方案
方法1:通过lambda默认参数绑定当前值
给lambda添加带默认值的参数,让i在定义时就被固定下来,而非调用时才引用外部变量:
def foo(stuff): print(stuff) fun_list = [lambda i=i: foo(i) for i in range(5)] for fun in fun_list: fun()
方法2:使用functools.partial绑定参数
借助functools.partial预先把i绑定到foo的参数上,生成新的函数:
from functools import partial def foo(stuff): print(stuff) fun_list = [partial(foo, i) for i in range(5)] for fun in fun_list: fun()
方法3:用生成器函数封装闭包
写一个单独的函数来创建lambda,确保每次迭代的i处于独立作用域:
def foo(stuff): print(stuff) def create_foo_func(i): return lambda: foo(i) fun_list = [create_foo_func(i) for i in range(5)] for fun in fun_list: fun()
内容的提问来源于stack exchange,提问作者Bucketking
相关产品推荐
相关产品推荐

