这在 Python FAQ 中有解释:为什么在循环中定义的具有不同值的 lambdas 都返回相同的结果?.
引用常见问题解答:
发生这种情况是因为 x 不是 lambdas 的本地变量,而是在外部范围中定义的,并且在调用 lambda 时访问它——而不是在定义它时...</p>
为了避免这种情况,您需要将值保存在 lambda 的本地变量中,这样它们就不会依赖全局的值……</p>
换句话说,您的新函数不是存储 的值,i
而是存储变量i
。而且它们都存储相同的变量i
,该变量10
在循环结束时具有值。事实上,如果你在i = 'spam'
前面添加一个 right F.mainloop()
,你会看到所有的按钮现在都打印出字符串spam
而不是数字。
这在您尝试创建闭包时非常有用 - 可以影响其定义环境的函数。*但是当您不尝试这样做时,这可能会妨碍您。
解决此问题的最简单方法是使用具有默认值的参数。默认值不包含变量;只是在定义函数时评估的值。所以:
newButton = Button(F,text="Show Number", command=lambda num=i: showNumber(num))
* 请注意,在这种情况下,实际上不涉及任何闭包,因为i
在封闭范围内是全局的,而不是局部的。但实际上,这只是因为 Python 对全局变量有特殊处理,这里不需要闭包;__closure__
从概念上讲,如果您认为存在一个,除非您开始查看or__code__
属性,否则您不会遇到任何麻烦。