了解 Python Lambda 闭包作用域
在 Python 中使用闭包时,理解其作用域行为至关重要。在这种情况下,闭包不仅指 lambda 函数,还指从其封闭范围访问变量的任何函数。
在给定的示例中:
<code class="python">names = ['a', 'b', 'c'] funcs1 = [gen_clousure(n) for n in names] funcs2 = [lambda x: test_fun(n, x) for n in names]</code>
funcs2 返回最后一个的原因所有案例的名称都是由于闭包范围而定。定义 lambda x: test_fun(n, x) 时,n 的值不会在定义期间计算并存储在函数内,而是仅在调用时计算和存储。因此,在调用函数时,n 包含循环中的最终值,导致姓氏被重复打印。
要解决此问题,必须确保闭包通过以下方式捕获预期值将其作为函数的参数提供。在这种情况下,您需要将 n 作为参数传递给 lambda 函数,例如:
<code class="python">funcs2 = [lambda x, n=n: test_fun(n, x) for n in names]</code>
或者,您可以将 lambda 函数封装在另一个函数中:
<code class="python">def makeFunc(n): return lambda x: x+n stuff = [makeFunc(n) for n in [1, 2, 3]]</code>
在这种情况下,内部 lambda 引用封闭函数 makeFunc 中的局部变量 n,从而导致每个函数捕获 n 的正确值。
以上是如何解决 Python Lambda 函数中的闭包作用域问题?的详细内容。更多信息请关注PHP中文网其他相关文章!