闭包就是在一个函数内部使用其他函数的变量的情况,即函数包裹着函数(函数中的变量是局部变量,其作用域为函数内部)
闭包的条件:
- 在一个函数中又定义了一个内部函数
- 外函数有返回值
- 返回值为内函数
- 内函数中使用了外函数的变量
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
变量的时候就会报错,但是闭包不会报错,因为没有被回收