理解 Python Lambda 函数中的闭包
原始问题:带有索引打印的 Lambda 闭包谜题
在编程中,闭包是指即使在封闭函数返回后也捕获其封闭函数的变量的内部函数。这允许内部函数保留对变量的访问,使它们在闭包的生命周期内持续存在。
lambda 表达式的一个常见用例是将变量绑定到函数。但是,如果在循环中使用(如提供的示例代码中所示),lambda 函数可能会因闭包而表现出意外行为。
代码说明
在给定的代码中,在循环内创建五个按钮。每个按钮都分配有一个 lambda 函数,该函数调用 makeId() 函数并打印索引 i。然而,当用户点击任意按钮时,makeId()函数总是打印5,这是i在循环中的最终值。
问题与解决方案
出现这个问题是因为当执行 lambda 表达式时,它将变量 i 解析为其当时的值。由于此时循环已经终止,i 被解析为其最终值,即 5。
要解决此问题,必须修改 lambda 表达式以使用 lambda 参数显式指定 i 的正确值。默认情况下,lambda 使用封闭范围的变量,但指定参数可确保在 lambda 内创建具有所需值的局部变量:
<code class="python">make_button = Tkinter.Button(frame, text="make!", command=lambda i=i: makeId(i))</code>
通过此修改,每个按钮的 lambda 函数都会捕获正确的值循环中的 i ,并且 makeId() 函数可以正确打印预期的索引。
附加说明
lambda 参数不需要具有相同的值name 作为封闭变量。它可以有任何名称,确保在 lambda 范围内捕获正确的值。
以上是为什么循环中的 Lambda 函数捕获最终索引值而不是循环迭代值?的详细内容。更多信息请关注PHP中文网其他相关文章!