Python 如何理解lambda中的闭包?

Python 如何理解lambda中的闭包?,python,lambda,tkinter,closures,Python,Lambda,Tkinter,Closures,我想在一个循环中创建5个按钮,并为每个按钮绑定一个索引以打印索引。在下面的解决方案中,它总是打印相同的索引 我的代码如下: for i in range(5): make_button = Tkinter.Button(frame, text ="make!", command= lambda: makeId(i)) def makeId(i): print(i) 它总是打印5。如何解决此问题?执行lambd

我想在一个循环中创建5个按钮,并为每个按钮绑定一个索引以打印索引。在下面的解决方案中,它总是打印相同的索引

我的代码如下:

for i in range(5):
    make_button = Tkinter.Button(frame, text ="make!", 
                                 command= lambda: makeId(i))

def makeId(i):
    print(i)

它总是打印5。如何解决此问题?

执行lambda时,lambda中的变量解析完成。此时,对于所有按钮,i=5。要纠正此问题,请执行以下操作:

 make_button = Tkinter.Button(frame, text ="make!", 
                              command= lambda i=i: makeId(i))
这会将i创建为lambda中的局部变量。这个局部变量将保存循环中正确的i值。局部变量可以有任何名称,不一定是
i
,例如
command=lambda=i:makeId(a))