首页  >  文章  >  后端开发  >  如何避免 Lambda 函数由于共享作用域变量而出现意外行为?

如何避免 Lambda 函数由于共享作用域变量而出现意外行为?

Barbara Streisand
Barbara Streisand原创
2024-10-19 17:25:30170浏览

How to Avoid Unexpected Behavior in Lambda Functions Due to Shared Scope Variables?

Lambda 函数及其参数的作用域行为

创建 lambda 函数时,它会继承其封闭函数的作用域。然而,当使用迭代器循环生成一系列 lambda 函数时,会出现一个常见的误解。在这种情况下,lambda 函数共享相同的作用域变量,从而导致意外结果。

考虑以下简化代码:

<code class="python">def callback(msg):
    print msg

# Creating a list of function handles with an iterator
funcList = []
for m in ('do', 're', 'mi'):
    funcList.append(lambda: callback(m))

# Executing the functions
for f in funcList:
    f()</code>

预期输出为:

do
re
mi

然而,实际输出是:

mi
mi
mi

发生这种情况是因为 lambda 函数在创建时保留了对封闭范围内的共享变量 m 的引用。当执行 lambda 函数时,m 已被重新分配给“mi”,从而导致意外的输出。

要解决此问题,可以使用具有默认值的可选参数。这允许每个 lambda 函数捕获自己的变量值:

<code class="python">for m in ('do', 're', 'mi'):
    funcList.append(lambda m=m: callback(m))</code>

通过此修改,每个 lambda 函数在创建时都会维护 m 值的不同副本,从而产生所需的输出:

do
re
mi

以上是如何避免 Lambda 函数由于共享作用域变量而出现意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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