Ans*_*ssi 29 python lambda scope
如果我制作两个函数列表:
def makeFun(i):
return lambda: i
a = [makeFun(i) for i in range(10)]
b = [lambda: i for i in range(10)]
Run Code Online (Sandbox Code Playgroud)
为什么名单a和b不相等?
例如:
>>> a[2]()
2
>>> b[2]()
9
Run Code Online (Sandbox Code Playgroud)
Ste*_*202 21
正如其他人所说,范围界定是问题所在.请注意,您可以通过向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)
Run Code Online (Sandbox Code Playgroud)
结果是i现在显式放置在仅限于lambda表达式的范围内.
Jon*_*erg 20
技术上,lambda表达式封闭在i在全球范围内,这是最后一组到9这是这是明显的同 i正在所有10个lambda表达式简称.例如,
i = 13
print b[3]()
Run Code Online (Sandbox Code Playgroud)
在makeFun函数中,lambda在i调用函数时定义的内容上关闭.那是十种不同 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
>>>
Run Code Online (Sandbox Code Playgroud)