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()