Python Lambda 闭包作用域
理解 Python 中 lambda 闭包的行为可能很棘手。在本文中,我们探讨了 lambda 函数表现异常的情况,在所有情况下返回相同的值。
问题:
考虑以下代码:
<code class="python">names = ['a', 'b', 'c'] def test_fun(name, x): print(name, x) def gen_clousure(name): return lambda x: test_fun(name, x) funcs1 = [gen_clousure(n) for n in names] funcs2 = [lambda x: test_fun(n, x) for n in names]</code>
当调用 funcs1 中的函数时,我们得到了预期的输出:
a 1 b 1 c 1
但是,当调用 funcs2 中的函数时,我们得到了意想不到的结果:
c 1 c 1 c 1
预期输出应该与第一种情况相同,但相反,我们在所有情况下都会看到姓氏“c”的值。
解释:
理解这种行为的关键在于闭包的概念。 Python 中的闭包允许内部函数从其封闭范围访问变量。在第一种情况 (funcs1) 中,lambda 函数是在循环内创建的,但它从封闭范围捕获变量名称并将其绑定到 lambda 函数内的名称。
在第二种情况 (funcs2) ),但是,lambda 函数直接引用封闭范围中的变量 n,而不将其绑定到 lambda 函数内的名称。这意味着当调用 lambda 函数时,它会计算当时的 n,它总是返回循环中的最后一个值,从而导致意外的输出。
避免问题:
为了避免此问题并实现所需的行为,我们必须确保 lambda 函数从封闭范围捕获变量并将其绑定到 lambda 函数内的名称。一种方法是将 lambda 函数包装在另一个函数中:
<code class="python">def makeFunc(n): return lambda x: x+n</code>
makeFunc 中生成的 lambda 函数从封闭范围捕获 n 的值并将其绑定到 lambda 函数内的名称,实现期望的行为。
以上是是什么导致 Python 中出现意外的 Lambda 关闭行为?的详细内容。更多信息请关注PHP中文网其他相关文章!