闭包
首先要明白的一点是,和变量名一样的,函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候 就是引用传递,而且函数名也可以当做一个参数来使用。
结构
- 函数的内部又定义了函数,外部函数运行时,才开始内部函数的定义,然后将内部函数的引用传递函数外的对象
- 外部函数: 外部函数返回内部函数的引用/函数名
- 内部函数: 内部函数使用了外部函数的参数或者变量
- 外部函数和内部函数构成的整体,成为闭包
闭包的例子:
def outer(number):
def inner(i_num):
print("内部函数传递的参数: ", i_num)
print("内部函数使用了外部函数的变量/参数", number)
return inner
if __name__ == '__main__':
f = outer(100)
f(20)
输出结果:
内部函数传递的参数: 20
内部函数使用了外部函数的变量/参数 100
闭包与普通函数的区别:
- 普通函数能保存功能,但是不能保存传送给函数的数据
- 闭包能保存功能,也可以保存数据
注意:
- 闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
- 闭包内部函数修改外部函数传入的变量,需要使用nonlocal来声明
def outer(number):
def inner(num):
nonlocal number
print('外部变量number: ', number)
print('内部变量num: ', num)
number = 30
print('修改外部变量num: ', number)
return inner
if __name__ == '__main__':
f = outer(100)
f(20)