Python Lambda 函数和局部变量绑定
使用 Python lambda 函数时,了解它们在引用局部变量方面的行为非常重要它们定义的范围。下面的代码说明了这个问题:
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda: pv(v)) for xx in x: xx()</code>
在这种情况下,我们期望看到 0 和 1 打印到控制台。然而,实际输出打印 1 两次。此行为源于 Python lambda 绑定到局部变量的方式。
陷阱:早期绑定
Python lambda 在调用时不会绑定到局部变量的引用被创建了。相反,它们绑定到该特定时间点的变量值。因此,当调用 lambda 时,它访问变量的当前值,而不是创建时可用的值。
解决方案:使用默认参数进行后期绑定
要将局部变量绑定到 lambda 函数并保留其正确引用,我们可以使用后期绑定。这是通过向 lambda 函数传递默认参数来实现的,如下所示:
<code class="python">x.append(lambda v=v: pv(v))</code>
通过此更改,lambda 将在创建 lambda 时绑定到 v 的值,而不是在调用它时。因此,当我们迭代列表 x 并调用每个 lambda 函数时,我们将获得预期的输出 0 和 1。
理解早期绑定
进一步澄清这个概念,请考虑以下示例:
<code class="python">x = "before foo defined" def foo(): print(x) x = "after foo was defined" foo()</code>
此代码片段将“定义 foo 后”打印到控制台,演示变量是在函数调用时绑定的,而不是创建时。
以上是为什么 Python Lambda 绑定到局部变量的值,而不是引用?的详细内容。更多信息请关注PHP中文网其他相关文章!