闭包
什么是闭包:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。
需要满足的条件
1、一个函数内嵌套一个函数
2、外部函数的返回值必须是这个内部函数
3、内部函数必须使用外部函数中的局部变量
def fun_1():
num_1=9
def fun_2(num_2):
print(num_1+num_2)
return fun_2
f=fun_1() #现在f=fun_2
f(8) #fun_2(8)
输出 17
这时就称fun_2为闭包
由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放
def fun_2():
a=list()
def fun(num):
a.append(num)
print(num)
return a
return fun
g1=fun_2()
g2=g1(2)
print('****',g2)
g3=g1(3)
print('*****',g3)
输出结果
2
**** [2]
3
***** [2, 3]
当执行fun_2函数时,变量a被创建。执行g1(2)时,列表a添加一个值2,当执行g2(3)时,列表a又添加了一个值。我们知道一个函数内的局部变量的生命周期是从执行函数开始到到结束。而现在我们函数已经执行完了,按道理来讲局部变量a应该清除才对。这就是因为闭包的原因,上面也说了闭包使用了外部函数的局部变量,这就导致局部变量a一直在内存中无法释放,占用内存。
为什么使用闭包?
闭包就是为了不懂原函数的代码, 还要给他增加新功能的一个手段,通过外面的一层层函数传递的参数,让最内层函数,直接调用外层函数的代码,增加新的功能。
优点:闭包优化了变量,原来需要类对象完成工作,闭包也可以完成。
缺点:由于闭包引用外部函数的局部变量,则外部函数的局部变量,没有完全释放,占用内存。