在下面的代码中,我打算有两个按钮,当按下每个按钮时,分别将'0'和'1'打印到stdout。然而,当程序运行时,它们都打印'1',这是我在迭代中的最后一个值。为什么呢?
import Tkinter as tk
import sys
root = tk.Tk()
for i in range(0,2):
cmd = lambda: sys.stdout.write(str(i))
tk.Button(text="print '%d'" % i,command=cmd).pack()
root.mainloop()
答案 0 :(得分:5)
创建它时(如您所愿),未在lambda中捕获i
。相反,两个函数都返回外部for循环中的i
,它在创建函数之后和运行之前发生变化。要捕获它,您可以使用默认值:
for i in range(0,2):
cmd = lambda i=i: sys.stdout.write(str(i))
tk.Button(text="print '%d'" % i,command=cmd).pack()
答案 1 :(得分:3)
答案 2 :(得分:1)
我认为使用匿名函数然后给它命名是有点奇怪的。为什么不这样写呢?
for i in 0,1:
def cmd():
return sys.stdout.write(str(i))
tk.Button(text="print '%d'"%i, command=cmd).pack()