Python 函数声明和变量赋值

Python 函数声明和变量赋值,python,lambda,Python,Lambda,我想问一个关于函数如何分配给变量的问题 我是Python初学者,学习函数 考虑以下代码块: 我知道lambda是一个匿名函数,只有一个表达式被计算和返回 这在myfunc(n)中显示: myfunc接受一个参数,在本例中为2,因此任何数字a都将加倍 然而,我在这里感到困惑 在这方面: mydoubler = myfunc(2) 我以为我们将myfunc的结果分配给mydoubler,但在print语句中: print(mydoubler(11)) 我们正在传递一个参数11,但我们从未在函数声

我想问一个关于函数如何分配给变量的问题

我是Python初学者,学习函数

考虑以下代码块:

我知道
lambda
是一个匿名函数,只有一个表达式被计算和返回

这在
myfunc(n)
中显示:

myfunc
接受一个参数,在本例中为2,因此任何数字
a
都将加倍

然而,我在这里感到困惑

在这方面:

mydoubler = myfunc(2)
我以为我们将
myfunc
的结果分配给
mydoubler
,但在print语句中:

print(mydoubler(11))
我们正在传递一个参数
11
,但我们从未在函数声明的任何地方指定参数
a


python代码如何知道在本例中,print语句内部的
11
a
关联?

在本例中,您实际将doubler函数分配给了
mydoubler

mydoubler = myfunc(2)

您还指定了参数
a
,名称为2。因此,当您将一个数字传递给
mydoubler()
函数时,Python知道您已经指定了
n
lambda:a*n
创建的函数是一个闭包。当函数被称为
mydoubler(11)
时,它使用
11
作为
a
的值,并使用
2
(计算
lambda:a*n
myfunc
内部
n
的值作为
n
的值

mydoubler
的行为就像它被定义为

def mydoubler(a):
    return a * 2
您可以看到,值
2
通过一点挖掘存储在函数中:

>>> mydoubler.__closure__[0].cell_contents
2
(事实上,您可以改变这一点,尽管您只有在希望代码变得极其复杂的情况下才会这样做:

>>> mydoubler.__closure__[0].cell_contents = 3
>>> mydoubler(2)
6

)来自
myfunc(2)
的返回值与此lambda等效

lambda a: a * 2
lambda接受1个参数,并将其加倍。在本例中,当您调用它时,通过将它赋给名称
mydoubler
,您传递给它的任何参数都是
a
,lambda接受的一个参数

等效代码:

mydoubler = lambda a: a * 2
output = mydoubler(11) # returns 11 * 2
print(output) # prints 22
不是“完全”;硬编码参数和使用闭包中存储的值之间有区别。
lambda a: a * 2
mydoubler = lambda a: a * 2
output = mydoubler(11) # returns 11 * 2
print(output) # prints 22