了解 Lambda 中的闭包:解析变量
在这种情况下,您尝试在循环中创建多个按钮,每个按钮按钮触发打印特定索引值的命令。但是,您遇到了一个问题,即按钮的命令始终打印相同的索引“5”。
此行为源于 lambda 中闭包的性质。定义 lambda 时,它会捕获封闭范围的变量并在执行时引用它们。在你的例子中,封闭范围是循环,其中变量 i 代表当前索引。
不幸的是,当执行 lambda 时(按下按钮时),i 的值已经达到了最后一个迭代并且对于所有按钮都等于“5”。这是因为捕获的变量 i 是对同一内存位置的引用,并且它所保存的值会随着循环的进行而更新。
要解决此问题,您需要创建一个捕获正确值的闭包每个按钮的 i 。您可以通过为 lambda 函数中的 i 参数提供默认值来实现此目的。例如:
<code class="python">make_button = Tkinter.Button(frame, text="make!", command=lambda i=i: makeId(i))</code>
通过提供 i=i 作为 lambda 参数的默认值,您将创建一个局部变量 i,它保存每个按钮的正确索引值。当按下按钮时,lambda 函数将使用捕获的局部变量 i 执行,并打印正确的索引。
以上是为什么我的按钮命令总是在带有 Lambda 的循环中打印相同的索引?的详细内容。更多信息请关注PHP中文网其他相关文章!