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

时间:2010-07-01 06:48:26

标签: 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()

3 个答案:

答案 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)

肯定是

中的问题

On lambdas, capture, and mutability

一遍又一遍地出现......

答案 2 :(得分:1)

我认为使用匿名函数然后给它命名是有点奇怪的。为什么不这样写呢?

for i in 0,1:
    def cmd():
        return sys.stdout.write(str(i))
    tk.Button(text="print '%d'"%i, command=cmd).pack()