Python的lambda迭代不能按预期工作

apa*_*apa 1 python lambda tkinter

在下面的代码中,我打算有两个按钮,当按下每个按钮时,分别将'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()
Run Code Online (Sandbox Code Playgroud)

new*_*cct 5

i不是在当你创建它的拉姆达捕捉(为你想).相反,两个函数都返回i外部for循环,它在创建函数之后和运行之前发生变化.要捕获它,您可以使用默认值:

for i in range(0,2):
    cmd = lambda i=i: sys.stdout.write(str(i))
    tk.Button(text="print '%d'" % i,command=cmd).pack()
Run Code Online (Sandbox Code Playgroud)