You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中lambda函数在for循环内外调用结果差异的原因问询

拆解Python闭包的延迟绑定坑

咱先把你的代码和输出清晰列出来:

def foo():
    lst = []
    for i in range(4):
        lst.append(lambda: i)
        print(lst[i]())
    print([f() for f in lst])

foo()

输出结果:

0
1
2
3
[3, 3, 3, 3]

为什么循环内调用能输出0-3?

在循环的每一次迭代里,当你执行print(lst[i]())的时候,这个调用是立刻发生的。此时i正处于当前迭代的数值(第一次i=0,第二次i=1,以此类推),lambda函数会直接去当前作用域取i的实时值,所以每次都能输出对应的0、1、2、3。

为什么循环外调用全是3?

这就是Python闭包的延迟绑定特性在搞事情:lambda函数并没有在定义的时候就把i的数值“固定”下来,而是等到被调用的时候,才会去外层作用域查找i的当前值。

当整个for循环结束后,i的值已经停在了3(因为range(4)最后一次迭代i=3,循环结束后i不会被销毁)。这时候你再遍历列表调用每个lambda,它们都会找到同一个i——也就是最后剩下的3,所以输出全是3。

怎么解决这个问题?

如果想让每个lambda保存当时的i值,可以用默认参数把数值绑定在函数定义阶段:

def foo():
    lst = []
    for i in range(4):
        lst.append(lambda x=i: x)  # 默认参数x在定义时就取当前i的值
        print(lst[i]())
    print([f() for f in lst])

foo()

这样输出就会是:

0
1
2
3
[0, 1, 2, 3]

因为默认参数是在函数定义的时候求值的,每个lambda都拿到了当时迭代的i值,不会再去引用循环结束后的i了。

内容的提问来源于stack exchange,提问作者pavan kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:44:40