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)) # Calling the lambda functions for f in funcList: f()</code>
预期的结果此代码的输出是:
do re mi
但是,实际输出是:
mi mi mi
这是因为 lambda 函数从封闭范围捕获对变量 m 的引用。当迭代器执行循环时,它在最终迭代中将值“mi”赋给 m。因此,所有 lambda 函数在执行时都会引用“mi”,即使在创建过程中向它们传递了不同的值。
要解决此问题,您可以在以下位置捕获 m 的值:创建 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中文网其他相关文章!