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