考虑以下代码片段:
# directorys == {'login': <object at ...>, 'home': <object at ...>} for d in directorys: self.command["cd " + d] = (lambda : self.root.change_directory(d))
目标是创建一个包含两个带有键“的函数的字典” cd 登录”和“cd home”。然而,结果显示,两个 lambda 函数具有相同的内容,并且键为“cd login”。
要理解这种意外行为,重要的是要考虑 lambda 函数如何在嵌套循环中工作。当 lambda 函数在循环中定义时,它会捕获周围范围的变量。在这种情况下,循环中的变量 d 被每个 lambda 函数捕获。
但是,lambda 函数是延迟执行的。因此,当您在循环之外访问 self.command 字典时,所有 lambda 函数都捕获了相同的 d 变量,它是循环中 d 的最后一个值。因此,所有函数都指向相同的方法,从而导致观察到的行为。
为了解决这个问题,我们需要确保每个 lambda 函数捕获不同的 d 值。一种解决方案是将 d 作为参数传递给 lambda 函数并提供默认值:
lambda d=d: self.root.change_directory(d)
现在,lambda 函数内的 d 使用该参数,即使它具有相同的名称。创建函数时会计算此参数的默认值,并为循环的每次迭代将其绑定到正确的 d 值。
或者,我们可以使用嵌套闭包来实现相同的结果:
(lambda d: lambda: self.root.change_directory(d))(d)
以上是为什么循环中的 Lambda 函数捕获最后一个值而不是每次迭代的值?的详细内容。更多信息请关注PHP中文网其他相关文章!