我正在寻找的StackOverflow一个解决我的问题,当我偶然发现了这个用户提交的解决方案(别人的问题):
appsMenu.add_command(label=app, command=openApp(Apps[app]))
调用函数命令参数需要被包裹在一个lambda
,以防止它们被调用的时候了。 另外,在一个结合的for循环的命令所需要的循环变量作为默认参数,以便它在正确的值的每个时间绑定。
appsMenu.add_command(label=app, command=lambda app=app: openApp(Apps[app]))
正如你所看到的,用户写lambda app=app
,以及对我的爱,我想不通为什么。 它有什么作用?
将lambda
表达式用于定义一个一行(匿名)函数。 因此,写作
f = lambda x: 2*x
是(或多或少),相当于
def f(x):
return 2*x
另外,对于正常功能,也可以有默认参数也处于lambda
功能。 从而
k = 2
f = lambda x=k: 2*x
可以被称为或者作为f()
,其中x
将是的值k
即2
或f(3)
其中, x = 3
。 现在,使其更奇怪的,因为lambda
功能都有自己的名字空间,它是可以更换k
与x
为
x = 2
f = lambda x=x: 2*x
然后意味着缺省值f()
将是(外) x
值(即2
),如果没有其他参数设置。
因此,表达
lambda app=app: openApp(Apps[app])
是一个函数(未命名)它有一个参数app
与(外)变量的默认值app
。 和调用时,它将执行该指令openApp(Apps[app])
其中Apps
是一个全球性的(外)对象。
现在,我们为什么要那,而不是仅仅写command=openApp(Apps[app])
调用时.add_command()
原因是,我们希望命令定义命令,即当,当调用执行不.add_command()
但在稍后的时间,即在选择的菜单项。
因此,推迟到执行我们总结的执行openApp(Apps[app])
中的功能。 选择菜单项时将被执行此功能。 因此,我们将调用openApp
然后,而不是现在 (当时我们想添加的命令),这将是情况并非如此。
现在,由于lambda
函数调用不带参数,它将使用默认参数(外) app
为(内部) app
。 这使得整个参数有些多余,作为外变量是内直接访问lambda
表达。 因此,能够简化表达式lambda: openApp(Apps[app])
即没有室内用参数,使得整行
appsMenu.add_command(label=app, command=lambda: openApp(Apps[app]))
对我来说,这看起来有点简单,是我写的方式,但在概念上有这一点,并使用默认参数的代码没有什么区别。
文章来源: How does 'lamba variable=variable: somefunction()' work? (Example included)