lambada函数的闭包特性
python
def create_callbacks():
return [lambda: i for i in range(4)]
callbacks = create_callbacks()
print([cb() for cb in callbacks])
代码输出结果为 [3, 3, 3, 3]
原因解析:
- lambda 函数的闭包特性:在 create_callbacks() 中,列表推导式创建了四个 lambda 函数,每个函数都返回变量 i。但这些 lambda 函数并没有在定义时捕获 i 的当前值,而是捕获了变量 i 本身(即引用)。
- 变量 i 的最终值:当循环 for i in range(4) 结束时,i 的值为 3。由于所有 lambda 函数共享同一个变量 i 的引用,因此当它们被调用时(在 print([cb() for cb in callbacks]) 中),都会使用 i 的最终值 3。
如何修正(如需捕获当前值):
如果想实现每个 lambda 返回对应的 i 值(即 [0, 1, 2, 3]),可以使用默认参数绑定当前值:
python
def create_callbacks():
return [lambda x=i: x for i in range(4)] # 通过默认参数固化当前 i 的值
callbacks = create_callbacks()
print([cb() for cb in callbacks]) # 输出 [0, 1, 2, 3]

