Python的lambda迭代不按预期工作

2024-03-29 12:40:47 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的代码中,我打算有两个按钮,当每个按钮被按下时,“0”和“1”将分别打印到标准输出。但是,当程序运行时,它们都会打印“1”,这是我在for迭代中得到的最后一个值。为什么?在

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()

Tags: 代码inimportcmd程序运行for标准tkinter
3条回答

当您创建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()

我认为使用匿名函数只是为了给它取个名字有点奇怪。为什么不这样写呢?在

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

当然这是

On lambdas, capture, and mutability

一次又一次。。。在

相关问题 更多 >