首页  >  文章  >  后端开发  >  如何解决 Python Lambda 函数中的闭包作用域问题?

如何解决 Python Lambda 函数中的闭包作用域问题?

Barbara Streisand
Barbara Streisand原创
2024-10-21 12:59:02609浏览

How to Address Closure Scoping Issues in Python Lambda Functions?

了解 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn