Python 如何';lamba variable=变量:somefunction()';工作(包括示例)

Python 如何';lamba variable=变量:somefunction()';工作(包括示例),python,python-3.x,lambda,command,Python,Python 3.x,Lambda,Command,我正在搜索StackOverflow来解决我的一个问题,突然发现用户提交的解决方案(针对其他人的问题): 调用函数的命令参数需要包装在lambda中,以防止立即调用它们。此外,在for循环中绑定的命令需要将循环变量作为默认参数,以便每次都绑定正确的值 appsMenu.add_command(label=app, command=lambda app=app: openApp(Apps[app])) 如你所见,用户编写了lambda app=app,出于对我的爱,我不知道为什么。它做什么?l

我正在搜索StackOverflow来解决我的一个问题,突然发现用户提交的解决方案(针对其他人的问题):

调用函数的命令参数需要包装在
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
是全局(外部)对象

现在,我们为什么要这样做,而不是在调用
.add_command()
时编写
command=openApp(Apps[app])
?原因是我们不希望在定义命令时(即调用
.add_command()
时)执行命令,而是希望在稍后的时间(即选择菜单项时)执行命令

因此,为了推迟执行,我们将
openApp(Apps[app])
的执行包装在一个函数中。选择菜单项后,将执行此功能。因此,我们将在那时调用
openApp
,而不是现在(在我们想要添加命令的时候),否则情况就是这样

现在,由于调用
lambda
函数时没有参数,因此它将使用其默认参数(外部)
app
作为(内部)
app
。这使得整个参数有点多余,因为外部变量可以在
lambda
表达式中直接访问。因此,可以将表达式简化为
lambda:openApp(Apps[app])
,也就是说,不带参数,使整行

appsMenu.add_command(label=app, command=lambda: openApp(Apps[app]))
对我来说,这看起来有点简单,这是我编写它的方式,但从概念上讲,这与带有默认参数的代码没有区别。

这是答案的副本:。
appsMenu.add_command(label=app, command=lambda: openApp(Apps[app]))