Python 中的 Lambda 闭包
在 Python 中,lambda 函数创建闭包,允许访问其范围之外的变量。但是,在循环中使用时,此行为可能会导致意外结果。
问题陈述
考虑以下代码,其中使用循环创建了五个按钮。每个按钮都绑定一个命令来打印其索引:
<code class="python">for i in range(5): make_button = Tkinter.Button(frame, text ="make!", command= lambda: makeId(i))</code>
行为
单击时,所有按钮都会打印相同的索引,始终为 5。发生这种情况的原因是lambda 中的变量解析发生在执行时。单击按钮时,循环已结束,所有按钮的 i 都等于 5。
解决方案
要解决此问题,我们需要在每个 lambda 中创建捕获 i 的正确值的局部变量。这可以通过将 i 作为参数传递给 lambda 来实现,如下所示:
<code class="python">make_button = Tkinter.Button(frame, text ="make!", command= lambda i=i: makeId(i))</code>
这会为每个 lambda 创建一个局部 i 变量,该变量保留循环迭代中 i 的值。通过这样做,我们确保每个按钮打印预期的索引。
以上是在循环中使用 Lambda 函数时,为什么所有按钮都会打印相同的索引?的详细内容。更多信息请关注PHP中文网其他相关文章!