gpt4 book ai didi

python - 对列表理解中的词法闭包感到困惑

转载 作者:太空狗 更新时间:2023-10-30 02:12:37 24 4
gpt4 key购买 nike

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 中不起作用,因为列表理解中的循环变量没有泄漏到全局范围内

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
>>>

关于python - 对列表理解中的词法闭包感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14514922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com