1.什么是闭包?
维基百科:
在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。
这里的自由变量指的是inner函数外、outer函数内的一个变量。相当于Python3.x中的nonlocal变量。
2.为什么要使用闭包?
(1)闭包避免了使用全局变量;
(2)闭包允许将函数与其所操作的某些数据(环境)关联起来。
这一点与面向对象编程是非常类似的:在面向对象编程中,对象允许 我们将某些数据(对象的属性)与一个或多个方法关联。
(3)此外,装饰器也是基于闭包的一种应用场景。
3.对闭包的深层理解 :
所有函数都有一个 __closure__属性,如果这个函数是一个闭包的话,那么它返回的是一个由 cell 对象 组成的元组对象。cell 对象的cell_contents 属性就是闭包中的自由变量。
这解释了为什么(outer函数的)局部变量脱离函数之后,还可以在函数之外(inner函数被调用时)被访问的原因的,因为它存储在了闭包的 cell_contents中了。
(以上均摘自Python之禅)
网友评论