这在Python FAQ解释:Why do lambdas defined in a loop with different values all return the same result?。
引述常见问题的答案:
这是因为x是不是本地的lambda表达式,但在外部范围的定义,它是访问时的拉姆达被调用 - 不是当它定义...
为了避免这种情况,您需要保存在局部变量的lambda表达式的值,使它们不依赖于全球的价值...
换句话说,您的新功能不存储的值i
,他们正在存储变量i
。并且它们全部存储相同的变量i
,在循环结束时它的值为10
。实际上,如果您在F.mainloop()
之前添加i = 'spam'
,您会看到现在所有按钮都打印出字符串spam
而不是数字。
当您尝试创建可能影响其定义环境的闭包功能时,这非常有用。但是当您尝试这样做时,而不是可能会阻碍。
最简单的方法是使用带默认值的参数。默认值不包含变量;只是在函数定义时评估的值。所以:
newButton = Button(F,text="Show Number", command=lambda num=i: showNumber(num))
*请注意,在这种情况下,有没有实际参与任何关闭,因为i
是一个全球性的,而不是在封闭范围内的局部。但实际上,这仅仅是因为Python对全局变量有特殊的处理,并且在这里不需要关闭;从概念上讲,如果你想到有一个,你不会陷入任何麻烦,除非你开始看__closure__
或__code__
属性。
非常感谢! :) – superyo40
这不太准确,因为这里实际上并不是封闭的。但这是一个比我的简洁的解释,希望更容易让新手理解。 – abarnert
@abarnert:谢谢你提到它 - 这是一点技术性的东西,让我喜欢StackOverflow,并在这个过程中学习。 – voithos