python、tkinter中,循环方式使用lambda传递参数,为什么只传了最后一个

导入tkinter,制作几个按钮,点击每个按钮时打印出一个变量值,我期待的效果是:三个按钮分别打印出0,1,2。但结果,得到的都是2。lambda传值怎么会这样??搞不懂,哪位老师赐教一下

import tkinter as tk
mywin = tk.Tk()
def fun(val):
print(val)
for i in range(0,3):
tk.Button(mywin, text='btn'+str(i), width=20, height=2, command=lambda:fun(i)).pack()
mywin.mainloop()

Italink 老师说lambda传值是传的变量i的引用,那么怎么样让lambda传递i的值,而不是i的引用呢??
tk.Button(mywin, text='btn'+str(i), width=20, height=2, command=lambda:fun(i)).pack() 这句要怎么写才行呢?

Italink 老师能再说的细一点吗? 我初学Python, 不懂的地方多......

可以使用偏函数partial代替lambda,lambda:fun(i)把改为partial(fun,i)即可

因为使用lambda表达式传入了一个参数(i)的引用,导致最后输出的时候都是i最后的值

你可以在for循环后面对进行赋值,可以发现按钮的提示信息也改变了

在传参的时候需要考虑用常量

我在使用时也遇到了这种情况,lambda表达式的延时调用,本就在这个地方使用lambda就是为了传参而不立即调用函数