一、概念
闭包(closure)是一种引用了非局部变量(non-local variable)的内嵌函数(nested function)。
名词解释:
内嵌函数(nested function):定义在其他函数内部的函数叫内嵌函数。内嵌函数可以访问所定义在的外部函数内的变量。
非局部变量:非局部变量(non-local variable)在python中默认只读,如果想要修改它,就需要声明为nonlocal变量(使用nonlocal关键词,python 3.X以后添加的)。
来定义一个闭包:
```
def print_msg(msg):
#this is the outer enclosing function
def printer():
#this is the nested function
print(msg)
return printer
another_print = print_msg("hello")
another_print()
```
上面这种关联着数据的代码块就是python中的闭包了。而且变量的取值会被保留,即使闭包超出了该变量的作用范围或者外部的函数被删除。
二、条件
满足什么条件才能被称为闭包呢?
像上面的例子一样,满足了以下3个条件:
1、需要有一个内嵌函数(定义在函数中的函数);
2、内嵌函数需要引用定义在外部函数中变量;
3、内嵌函数需要被返回;
三、场景
最常使用闭包的场景可以归纳为以下几种:
1、在一个类中只有非常少的方法(通常是只有一个);
2、避免使用全局变量的时候;
3、装饰器模式中;
4、提供一致的函数签名;