用python中的lambda表达式在循环中生成函数

2024-06-02 06:16:32 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我列出两个函数列表:

def makeFun(i):
    return lambda: i

a = [makeFun(i) for i in range(10)]
b = [lambda: i for i in range(10)]

为什么列表ab的行为不符合保存方式?

例如:

>>> a[2]()
2
>>> b[2]()
9

Tags: lambda函数in列表forreturndef方式
3条回答

技术上,lambda表达式是在全局范围内可见的i上的closed,最后一次设置为9。这是所有10个lambda中所指的相同的i。例如

i = 13
print b[3]()

makeFun函数中,lambda在调用函数时定义的i上关闭。它们是十种不同的

一组函数(a)对传递的参数执行操作,另一组(b)对全局变量执行操作,然后将其设置为9。检查拆卸:

>>> import dis
>>> dis.dis(a[2])
  1           0 LOAD_DEREF               0 (i)
              3 RETURN_VALUE
>>> dis.dis(b[2])
  1           0 LOAD_GLOBAL              0 (i)
              3 RETURN_VALUE
>>>

正如其他人所说,范围界定是问题所在。请注意,可以通过向lambda表达式添加额外的参数并为其指定默认值来解决此问题:

>> def makeFun(i): return lambda: i
... 
>>> a = [makeFun(i) for i in range(10)]
>>> b = [lambda: i for i in range(10)]
>>> c = [lambda i=i: i for i in range(10)]  # <-- Observe the use of i=i
>>> a[2](), b[2](), c[2]()
(2, 9, 2)

结果是i现在显式地放在lambda表达式的范围内。

相关问题 更多 >