【问题标题】:Python's lambda iteration not working as intendedPython 的 lambda 迭代没有按预期工作
【发布时间】:2010-07-01 06:48:26
【问题描述】:

在下面的代码中,我打算有两个按钮,当每个按钮被按下时,“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()

【问题讨论】:

    标签: python lambda tkinter


    【解决方案1】:

    i 在您创建它时不会在 lambda 中捕获(如您所愿)。相反,这两个函数都引用了外部 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()
    

    【讨论】:

      【解决方案2】:

      肯定是这个问题

      On lambdas, capture, and mutability

      一遍又一遍……

      【讨论】:

      • 那篇文章与python无关
      • 它有两个 Python 中相似的 StackOverflow 问题的链接,并且该问题超越了大多数具有 lambda 和 mutables 的语言。
      【解决方案3】:

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

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

      【讨论】:

      • @newacct: "for i in 0,1" 是正确的语法。在交互式 Python shell 中尝试一下,看看会发生什么。
      猜你喜欢
      • 2015-07-10
      • 1970-01-01
      • 2022-06-22
      • 2012-05-09
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多