首页  >  文章  >  后端开发  >  如何避免 Lambda 函数中的参数修改导致意外结果

如何避免 Lambda 函数中的参数修改导致意外结果

Patricia Arquette
Patricia Arquette原创
2024-10-19 17:28:01684浏览

How to Avoid Unexpected Results from Parameter Modifications in Lambda Functions

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

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