什么是闭包?\
我们先举个栗子:
在外部调用函数的内嵌函数(一般情况下函数的内嵌函数在外面是不可见的)
def outer():
a1 = 'test arg'
def inner():
print('inner', a1)
return inner # 注意,这里返回的是inner函数的内存地址,而不是执行结果。执行结果需要带()。
func = outer() # outer()的执行结果返回inner的内存地址,相当于inner
func() # 这里func加()相当于inner()。这样就可以在外部调用内部的函数了。
原则上,函数执行完毕,函数的全部变量应该释放。
但是上述的例中,outer执行完后,a1变量并没有释放。
这是为什么呢?
因为内嵌函数inner()在外部被func()调用,使得enclosing函数outer()的作用域不能释放。
所以inner()的返回值依然可以调用outer()的a1变量。\
在一个函数中定义了另外一个函数,内部函数里调用了外部函数的临时变量,
并且外函数的返回值是内函数,这样就构成了一个闭包。
-
特点:
- 必须有一个内嵌函数
- 内嵌函数必须引用外部函数中的变量
- 外部函数的返回值必须是内嵌函数
-
闭包的意义:返回的内嵌函数对象不仅是一个函数对象,在该函数外还包裹一层作用域(enclosing),
这使得该函数无论在何处调用,有限使用自己外层包裹的作用域。
使用闭包,可以隐藏内部函数的工作细节,只给外部使用者提供一个可以执行的内部函数的调用。

浙公网安备 33010602011771号