Lambda 函数及其参数的范围
在 Python 中,lambda 函数为定义内联函数提供简写表示法。但是,它们的作用域和参数处理可能会导致意外行为,如以下代码所示:
def callback(msg): print msg # Iterative Approach funcList = [] for m in ('do', 're', 'mi'): funcList.append(lambda: callback(m)) for f in funcList: f() # Individual Creation funcList = [] funcList.append(lambda: callback('do')) funcList.append(lambda: callback('re')) funcList.append(lambda: callback('mi')) for f in funcList: f()
预期输出为:
do re mi do re mi
但是,实际输出为:
mi mi mi do re mi
此行为源于以下事实:lambda 函数不会从封闭范围创建变量的副本。相反,他们维护对这些变量的引用。因此,循环中 m 值的更改会影响该循环中创建的所有 lambda 函数。
要解决此问题,通常的做法是在创建 lambda 函数时捕获 m 的值将其用作可选参数的默认参数:
for m in ('do', 're', 'mi'): funcList.append(lambda m=m: callback(m))
这可确保每个 lambda 函数捕获 m 的正确值,从而产生所需的输出:
do re mi do re mi
以上是为什么 Lambda 函数的范围会影响其在 Python 中的输出?的详细内容。更多信息请关注PHP中文网其他相关文章!