一、闭包必须具备的条件
1、必须存在函数嵌套。
2、内部函数必须引用外部函数的变量。
3、内部函数必须不能引用全局变量。
4、外部函数的返回值必须是内部函数的函数名。
二、闭包的伪代码格式
def 外层函数(参数):
def 内层函数():
print("内层函数执行", 参数)
return 内层函数
内层函数的引用 = 外层函数("传入参数")
内层函数的引用()
三、闭包的简单案例
def func1(a, b):
c=100
def inner_func():
s=a+b+c
print(s)
return inner_func
f=func1(1,2)
f()
#输出结果:126
四、变量内存的释放
通常情况下,当一个函数运行结束,函数内部的所有东西都会释放掉,还给内存,函数的局部变量也会因此消失。然而,闭包是一种特殊情况,如果外部函数在结束时发现其变量会在内部函数中被使用,就会把这个变量绑定给内部函数,然后再结束自己的运行。
五、内部函数中修改外函数的值
上面讲到,一般在函数结束时,会释放临时变量,但在闭包中,由于外函数的临时变量在内函数中用到,此时外函数会把临时变量与内函数绑定到一起,这样虽然外函数结束了,但调用内函数时依旧能够使用临时变量,即闭包外层的参数可以在内存中进行保留
如果想要在内函数中修改外函数的值,需要使用 nonlocal 关键字声明变量
def func1(a, b):
c=100
def inner_func():
nonlocal c
c+=23
s=a+b+c
print(s)
return inner_func
f=func1(1,2)
f()
#输出结果:126
六、在内部函数中修改全局变量的值
则需要将全局变量声明global在内部函数中
global_num=99
def func1(a, b):
c=100
def inner_func():
nonlocal c
global global_num
global_num+=33
c+=23
s=a+b+c+global_num
print(s)
return inner_func
f=func1(1,2)
f()
#输出结果:258
七、闭包的作用
1、可以使用同级的作用域
2、读取其他元素的内部变量
3、延长作用域
def func1(a, b):
c=10
def inn_fun():
s=a+b+c
print(s)
return inn_fun
ser=func1(6,9)
ser2=func1(2,8)
ser()
ser2()
#输出结果:
#25
#20
八、闭包总结
1、闭包似乎优化了变量,原来需要类对象完成的工作,闭包也可以完成。
2、由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存。
3、闭包的好处,使代码变得简洁,便于阅读代码。
4、闭包是理解装饰器的基础。