Python 的 lambda 迭代未按预期工作

发布于 2024-09-07 09:32:51 字数 307 浏览 3 评论 0原文

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

In the code below I intend to have two buttons, and when each is pressed '0' and '1' are to be printed to stdout, respectively. However when the program is run, they both print '1', which is the last value i had in the for iteration. Why?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

疯了 2024-09-14 09:32:51

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

The i is not captured in the lambda when you create it (as you wanted). Instead, both functions refer back to the i in the external for loop, which changes after the function is created and before it is run. To capture it, you can use a default value:

for i in range(0,2):
    cmd = lambda i=i: sys.stdout.write(str(i))
    tk.Button(text="print '%d'" % i,command=cmd).pack()
缱倦旧时光 2024-09-14 09:32:51

中的问题

这肯定是On lambdas、capture 和 mutability

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

Surely it's the issue in

On lambdas, capture, and mutability

that comes up over and over...

记忆消瘦 2024-09-14 09:32:51

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

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

I think it's a bit odd to use an anonymous function just to then give it a name. Why not write it like this?

for i in 0,1:
    def cmd():
        return sys.stdout.write(str(i))
    tk.Button(text="print '%d'"%i, command=cmd).pack()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文