为什么Python中的lambda函数不闭包参数?

10 投票
5 回答
2081 浏览
提问于 2025-04-17 02:50

代码更能说明问题:


from pprint import pprint

li = []

for i in range(5):
        li.append(lambda : pprint(i))

for k in li:
        k()

yield:

4
4
4
4
4

为什么不呢

0
1
2
3
4

??

谢谢。

附言:如果我写完整的装饰器,它就能按预期工作:



from pprint import pprint

li = []

#for i in range(5):
        #li.append(lambda : pprint(i))

def closure(i):
        def _func():
                pprint(i)
        return _func

for i in range(5):
        li.append(closure(i))

for k in li:
        k()

5 个回答

3

如果你不想使用默认参数,因为这样可能会在不小心传入参数时引发错误,你可以使用一个嵌套的lambda表达式:

from pprint import pprint

li = []

for i in range(5):
    li.append((lambda x: lambda: pprint(x))(i))

for k in li:
    k()

这就是你所说的closure函数的匿名版本。

3

它确实正确地引用了 i,但问题在于,当你的列表被填充时,i 的值已经是最后一个项目的值了,也就是循环结束时的值,所以你看到的都是 4

12

你需要做的是:

lambda i=i: pprint(i)

而不是捕捉当前的 i 的值

撰写回答