且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Tkinter选项菜单将命令添加到多个选项菜单

更新时间:2023-11-29 23:43:34

这是一个涉及闭包的非常常见问题。请看以下示例:

alist = [lambda : x for x in range(10) ]
print (alist[2]()) #9
print (alist[4]()) #9

都是9。为什么?因为每个lambda函数都引用变量xx在循环的每次迭代中都会更改,但它们仍然引用同一个对象

解决此问题的一种方法是使用默认参数。默认参数在创建函数时求值,而不是在调用时求值。

alist = [lambda y=x: y for x in range(10) ]
print (alist[2]()) #2
print (alist[4]()) #4

(做同样事情的另一种方式涉及functools.partial,您有时会看到.)

我经常说--"注意闭包"。它们可能有点棘手。