Lambda 函数及其参数的范围
Lambda 函数是匿名函数,可以捕获其封闭函数的范围。这允许他们从父作用域访问变量和参数。但是,当 lambda 函数使用在封闭函数内修改的参数时,此行为有时会导致意外结果。
要说明此问题,请考虑以下代码:
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()
这段代码的预期输出是:
do re mi
但是实际输出是:
mi mi mi
这是因为 lambda 函数从封闭范围捕获对变量 m 的引用。当迭代器执行循环时,它在最终迭代中将值“mi”赋给 m。因此,所有 lambda 函数在执行时都会引用“mi”,即使在创建过程中向它们传递了不同的值。
要解决此问题,您可以在以下位置捕获 m 的值:创建 lambda 函数的时间,将其用作可选参数的默认值:
for m in ('do', 're', 'mi'):
funcList.append(lambda m=m: callback(m))
这确保每个 lambda 函数都可以访问自己的 m 副本,捕获循环迭代期间分配的值。该代码的输出将是:
do re mi
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3