在列表理解中被词汇封闭困惑

Des*_*Des 4 python

l = [1, 2, 3]
a,b,c = [lambda: n*n for n in l]
a()  #=> 9
b()  #=> 9
c()  #=> 9
Run Code Online (Sandbox Code Playgroud)

为什么是这样?我期望a(),b(),c(),为1,4和9.

Joh*_*ooy 8

n 不在函数的本地闭包中.

尝试

a, b, c = [lambda n=n: n*n for n in l]
Run Code Online (Sandbox Code Playgroud)

默认参数的这种"滥用"导致n为每个函数创建一个被调用的局部变量

这是在Python2中创建闭包的另一种方法

>>> L=[1, 2, 3]
>>> def fgen():
...     local_n = global_n
...     def f():
...         return local_n * local_n
...     return f
>>> a, b, c = [fgen() for global_n in L]
>>> a()
1
>>> b()
4
>>> c()
9
Run Code Online (Sandbox Code Playgroud)

它在Python3中不起作用,因为列表推导中的循环var不会泄漏到全局范围中

Python3可以更好地阻止我们在函数中使用全局函数,因此如果要使用列表推导,则需要传递参数

>>> L=[1, 2, 3]
>>> def fgen(param_n):
...     local_n = param_n
...     def f():
...         return local_n * local_n
...     return f
... 
>>> a, b, c = [fgen(n) for n in L]
>>> a()
1
>>> b()
4
>>> c()
9
>>> 
Run Code Online (Sandbox Code Playgroud)