内部函数的定义:
1.可以访问外部函数的变量
2.内部函数可以修改外部函数中可变类型的变量:例如:list
3.内部函数修改全局的不可变变量时,需要在内部函数声明global 变量名
4.内部函数修改外部函数的不可变变量时,需要在内部函数中声明nonlocal 变量名
def func():
s = 5
def add():
nonlocal s
s += 1
add()
return s
result = func()
print(result)
# 输出结果:
6
判断一个函数是否是闭包:
1.在外部函数中定义了内部函数
2.外部函数有返回值
3.返回值是内部函数名
4.内部函数引用过外部函数的变量值
保存返回闭包时的状态(外层函数变量)
重复调用会在上一次调用的值的基础上再计算
def func():
s = 5
def add():
nonlocal s
s += 1
print(s)
return add
result = func() # 此时result接收到的就是func里的内部函数add
result() # 相当于调用内部函数add
result() # 在上一步运算结果的基础上再进行计算
# 输出结果:
6
7
闭包的缺点:
1.作用域没有那么直观;
2.因为变量不会被垃圾回收所以有一定的内存占用问题。
闭包的作用:
1.可以使用同级的作用域;
2.读取其他元素的内部变量;
3.延长作用域
闭包小结
1.闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成;
2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存;
3.闭包的好处,使代码变得简洁,便于阅读代码;
4.闭包是理解装饰器的基础。