Python中的闭包

Source

闭包就是在一个函数内部使用其他函数的变量的情况,即函数包裹着函数(函数中的变量是局部变量,其作用域为函数内部)

闭包的条件:

  1. 在一个函数中又定义了一个内部函数
  2. 外函数有返回值
  3. 返回值为内函数
  4. 内函数中使用了外函数的变量
def outter():
    a = 1
    print("外函数")
    def inner():
        b = 1
        print("内函数")
        print("a+b = {}".format(a+b))
    return inner

res = outter()
res()

外函数
内函数
a+b = 2

闭包的缺点:其作用域没有name直观并且会有一定的内存占用问题,因为变量没有被垃圾回收机制回收
闭包的作用:可以读取外函数中的变量,延长作用域, 闭包将外部的函数常驻的在内存中,导致垃圾不能够及时被回收,所以将局部变量变成了全局变量,所以尽量不要使用闭包
python 中使用闭包的情况可能多数在装饰器中使用

其他写法:

1、

def outter():
    a = 1
    print("外函数")
    def inner():
        b = 1
        print("内函数")
        print("a+b = {}".format(a+b))
    return inner()

res = outter()
print(res)

外函数
内函数
a+b = 2
None

返回的是inner(),而inner()没有返回值,因此在最后还会打印一个None

2、

def outter():
    a = 1
    print("外函数")
    def inner():
        b = 1
        print("内函数")
        print("a+b = {}".format(a+b))
    return inner

res = outter()
print(res)

外函数
<function outter.<locals>.inner at 0x000002D036EA8E50>

函数的调用本质就是一个压栈的过程, 调用res = outter()时候就是一个压栈的过程,当执行完
print(res) 弹栈的过程,局部变量就会被python中的垃圾回收机制回收,回收之后在 inner() 里面使用 a 变量的时候就会报错,但是闭包不会报错,因为没有被回收