1 什么是闭包
创建闭包的方法:
- 定义一个外函数outer();
- outer()中定义一个临时变量;
- outer()中定义一个内函数inner();
- inner()中使用了outer中的临时变量;
- outer()的返回值是对inner的引用;
这样就创建了一个闭包, 闭包的特性见第3节.
2 闭包实例
def outer(): #1. 定义一个外函数outer()
_list_tmp = list() #2. outer()中定义一个临时变量
def inner(s_new_ele): #3. outer()中定义一个内函数inner();
_list_tmp.append(s_new_ele) #4. inner()中使用了outer中的临时变量;
print(_list_tmp)
return _list_tmp
return inner #5. outer()的返回值是对inner的引用;
if __name__ == '__main__':
outer_0 = outer() # outer_0中绑定了一个临时变量_list_tmp
outer_0('a') # 返回['a']
outer_0('b') # 返回['a', 'b']
outer_1 = outer() # outer_1中绑定了另一个临时变量_list_tmp, 与outer_0中的相互独立
outer_1('x') # 返回['x']
outer_1('y') # 返回['x', 'y']
outer_0('c') # 返回['a', 'b', 'c']
outer_1('z') # 返回['x', 'y', 'z']
3 闭包的特点
- 从外部读取函数内部的变量.
- 将创建的变量始终保持在内存中.
- 封装对象的私有属性和私有方法.
一般情况下, 一个函数运行结束时, 函数内部的临时变量就销毁了.
但闭包比较特殊, outer()运行结束后, 由于它的临时变量用在inner()中, 所以这个临时变量就绑定给inner()了.
并且, 多次运行outer()函数返回的多inner中的临时变量是相互独立的.
4 闭包的应用
- 装饰器.
- 面向对象, 由于临时变量在inner之间是相互独立的, 与class有相同的特点, 所以可以使用闭包来实现class(python的class不是用闭包实现的).
- 实现单例模式.