闭包避免了使用全局变量,此外,闭包容许将函数与其所操做的某些数据(环境)关连起来。这一点与面向对象编程是很是相似的,在面对象编程中,对象容许咱们将某些数据(对象的属性)与一个或者多个方法相关联。编程
通常来讲,当对象中只有一个方法时,这时使用闭包是更好的选择。来看一个例子:闭包
def adder(x): def wrapper(y): return x + y return wrapper adder5 = adder(5) # 输出 15 adder5(10) # 输出 11 adder5(6)
这比用类来实现更优雅,此外装饰器也是基于闭包的一中应用场景。app
全部函数都有一个 __closure__
属性,若是这个函数是一个闭包的话,那么它返回的是一个由 cell 对象 组成的元组对象。cell 对象的cell_contents 属性就是闭包中的自由变量。函数
>>> adder.__closure__ >>> adder5.__closure__ (<cell at 0x103075910: int object at 0x7fd251604518>,) >>> adder5.__closure__[0].cell_contents 5
这解释了为何局部变量脱离函数以后,还能够在函数以外被访问的缘由的,由于它存储在了闭包的 cell_contents中了。spa