什么是闭包?
我们先举个栗子:
在外部调用函数的内嵌函数(一般情况下函数的内嵌函数在外面是不可见的)
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), 这使得该函数无论在何处调用,有限使用自己外层包裹的作用域
特点:return内嵌函数