1. 函数执行完后,函数内的变量会被释放
2. 闭包:函数嵌套函数,内部函数调用外部函数的变量
3. 闭包的好处:
- 延长变量在内存中存活的时间
- 在全局下可以直接控制函数内部的变量,因为全局调用了内部函数返回的方法,此时函数并没有执行完函数内的变量还没有被释放
- 如果一个函数的方法被调用了100次,里面的变量也会创建和销毁100次,此时使用闭包可以创建节省时间
4. 闭包的缺点:
- 函数执行完后,函数内部的变量没有被释放,占用内存时间过长
- 容易导致内存泄露
- 解决方法:
- 能不用闭包就不用
- 及时释放 使用 None
# 在这里暂时使用 nonlocal 声明,因为内部函数不能直接修改外部函数的不可变数据类型,为了实现和 js 一样的效果才使用了 nonlocal
def fn1():
a = 1
def fn2():
nonlocal a
a += 1
return a
return fn2
closure = fn1()
num1 = closure() # a = 2
num2 = closure() # a = 3
closure = None # 让内部函数成为垃圾对象 -> 回收闭包
5. .__closure__ 判断是否是闭包
def fn1():
v = 1
def fn2():
print(v)
print(fn2.__closure__) # (<cell at 0x00000232D56DC0D8: int object at 0x0000000065565320>,)
fn2()
fn1()
def fn1():
def fn2():
v = 1
print(fn2.__closure__) # None
fn2()
fn1()