Lambda 无法捕获循环中的临时变量,如 test01 函数的例子。如果想要捕获循环中的临时变量,可以使用 test02 闭包函数、test03 类封装、test04 partial 函数中的方式。
from functools import partial def test01(): def task(number): print('task:', id(number), number) func_list = [] for number in range(10): print('for: ', id(number), number) # lambda 绑定的是局部变量的引用,而不是引用的值 func_list.append(lambda: task(number)) for func in func_list: func() def test02(): def wrapper(number): def task(): print('task:', id(number), number) return task func_list = [] for number in range(10): print('for: ', id(number), number) func_list.append(wrapper(number)) for func in func_list: func() def test03(): class wrapper: def __init__(self, func, param): self.func = func self.param = param def __call__(self): return self.func(self.param) def task(number): print('task:', id(number), number) func_list = [] for number in range(10): print('for: ', id(number), number) func_list.append(wrapper(task, number)) for func in func_list: func() def test04(): def task(number): print('task:', id(number), number) func_list = [] for number in range(10): print('for: ', id(number), number) func_list.append(partial(task, number)) for func in func_list: func() if __name__ == '__main__': # test01() # test02() # test03() test04()