Python Lambda 函数闭包捕获什么?
使用 Python lambda 函数闭包时,了解其捕获行为非常重要。闭包从其封闭范围捕获闭包中使用的变量值。然而,这种捕获发生的方式可能令人惊讶。
为了说明这一点,请考虑以下代码:
adders = [None, None, None, None] for i in [0, 1, 2, 3]: adders[i] = lambda a: i + a print(adders[1](3))
在此代码中,我们创建了一个 lambda 函数列表,这些函数采用单个输入并向其添加一个常量值。在函数创建期间,常量值最初设置为 i 的值。然而,当我们检查闭包列表时,我们惊讶地发现它们都引用了 i 的最终值,导致意外输出 6。
这种行为是由于闭包捕获了 i 的值而导致的。变量而不是它的引用。因此,当闭包创建后 i 的值发生变化时,闭包将继续引用最后捕获的值。
捕获当前值
捕获i 的当前值,我们可以使用一种称为“虚拟参数”技术的技巧。通过声明一个与我们想要捕获的变量同名的参数,并为其提供该变量的默认值,我们强制闭包捕获当前值。
for i in [0, 1, 2, 3]: adders[i] = lambda a, i=i: i + a # <-- Note the dummy parameter with a default value print(adders[1](3)) # Output: 4
通过这种技术,闭包将捕获 i 在创建时的值,确保之后对 i 的更改不会影响闭包的行为。
以上是Python Lambda 函数闭包实际捕获哪些变量?的详细内容。更多信息请关注PHP中文网其他相关文章!