l = [1, 2, 3]
a,b,c = [lambda: n*n for n in l]
a() #=> 9
b() #=> 9
c() #=> 9
为什么是这样?我预计 a()、b()、c() 为 1、4 和 9。
l = [1, 2, 3]
a,b,c = [lambda: n*n for n in l]
a() #=> 9
b() #=> 9
c() #=> 9
为什么是这样?我预计 a()、b()、c() 为 1、4 和 9。
n
不在函数的本地闭包中。
尝试
a, b, c = [lambda n=n: n*n for n in l]
默认参数的这种“滥用”导致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
但它在 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
>>>