了解 Lambda 函数中的闭包捕获
Python 闭包捕获定义它们的封闭范围的状态。具体来说,它们捕获 lambda 函数中引用的变量的值,这些变量不存在于其作用域中。
在提供的示例中,lambda 函数捕获变量 i,该变量在循环执行时被分配不同的值。但是,lambda 函数不会捕获对 i 所指向的对象的引用。相反,它们在创建时捕获 i 的值。
此行为解释了调用 adders[1](3) 时出现意外结果 6。尽管期望引用整数对象,但 lambda 函数捕获了值 3,这是分配给 i 的最终值。
实现在每个 lambda 函数中保留 i 当前值的所需行为,可以采用一种称为参数默认值的技术。通过向 lambda 函数提供默认参数,i 在创建时的值将被锁定。例如:
for i in [0, 1, 2, 3]: adders[i] = lambda a, i=i: i+a
在这种情况下,参数 i 的默认值设置为当前值i 的值。调用 lambda 函数时,它使用在创建过程中捕获的 i 值。
此方法可确保 adders 数组中的每个 lambda 函数捕获 i 的预期值,从而允许它们生成预期的值调用时输出。
以上是为什么 Python Lambda 函数捕获值而不是引用,如何解决这个问题?的详细内容。更多信息请关注PHP中文网其他相关文章!