python - 如何理解 lambda 中的闭包?

标签 python lambda tkinter closures

<分区>

我想循环制作 5 个按钮,并为每个按钮绑定(bind)一个命令来打印索引。在以下解决方案中,它始终打印相同的索引。

我的代码是这样的:

for i in range(5):
    make_button = Tkinter.Button(frame, text ="make!", 
                                 command= lambda: makeId(i))

def makeId(i):
    print(i)

它总是打印 5。我该如何解决这个问题?

最佳答案

lambda 中的变量解析是在执行 lambda 时完成的。此时,对于所有的按钮,i=5。要纠正此问题,请执行以下操作:

 make_button = Tkinter.Button(frame, text ="make!", 
                              command= lambda i=i: makeId(i))

这会将 i 创建为 lambda 中的局部变量。该局部变量将保存循环中 i 的正确值。局部变量可以有任何名称,不一定是 i,例如command= lambda a=i: makeId(a)).

关于python - 如何理解 lambda 中的闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28494089/

相关文章:

python - 循环中带有变量的 tkinter 绑定(bind)函数

python - 如何使用python在pygame中定义快进按钮?

c++ - 是否可以避免将参数复制到 lambda 函数?

python - Lambda 不适用于过滤器

python - 为什么我的模型总是准确地获得 0.5 AUC?

python - Python 中字符串的列表列表

java - 用谓词组合Java中两个相似的方法

Python 和列表框 (GUI)

python - 将多列和多行组合为字典中的单个值

python - 持续计算 pandas 数据框中大于阈值的值数量