循环中的 Lambda 函数
在 Python 中,lambda 函数提供了一种定义匿名函数的简洁方法。然而,当在循环中使用时,如果不能确保正确的绑定,它们可能会导致意外的行为。
考虑以下代码片段:
directorys = {'login': <object>, 'home': <object>} for d in directorys: self.command["cd " + d] = (lambda : self.root.change_directory(d))
目的是创建一个字典映射命令更改目录的函数的字符串。然而,结果却出乎意料:创建的两个 lambda 函数是相同的,并且执行相同的命令,将目录更改为“login”。
为什么会发生这种情况?
循环内的 Lambda 函数共享相同的函数作用域。这意味着 lambda 函数捕获的变量对于循环的所有迭代都是相同的。在本例中,“d”代表“directorys”字典中最后一项的值,即“login”。
解决问题
确保正确的绑定,我们需要确保每个 lambda 函数都可以访问自己唯一的“d”值。一种方法是将“d”作为具有默认值的参数传递:
lambda d=d: self.root.change_directory(d)
通过在循环的每次迭代中将“d”的默认值设置为“d”的当前值,我们为每个 lambda 函数创建一个唯一的闭包。或者,我们可以使用额外的闭包技术来实现相同的结果:
(lambda d=d: lambda: self.root.change_directory(d))()
这个外部 lambda 函数为“d”创建一个闭包,而内部 lambda 函数使用闭包中的“d”。
以上是为什么 Python 循环中的 Lambda 函数有时无法正确绑定?的详细内容。更多信息请关注PHP中文网其他相关文章!