目录
什么是闭包
定义:闭包就是能够读取外部函数内的变量的函数
定义一个函数A , 函数A中嵌套了另一个函数B,并且A将函数B进行返回,这里的函数B就叫做闭包
例如下面的代码,outer函数中有一个inner函数,inner函数可以获取到outer函数中的变量,outer函数将inner函数进行返回,F=outer() 将获取到inner函数对象,F此时保存的是innner函数所在位置的引用,F()相当于执行inner函数
inner函数就形成了闭包,外部函数返回的不是一个具体的值,而是一个函数。可以将返回的函数赋值给一个变量,这个变量可以在后面被继续执行调用
注:outer 内部的所有局部变量,对inner都是可见的,但是infunc内部的局部变量,对outfunc 是不可见的
def outer():
x = 1
def inner():
print(x)
return inner
F = outer() #获取了inner函数对象
F() #执行inner函数
闭包满足的条件
1.必须有一个内嵌函数
2.内嵌函数必须引用外部函数中的变量
3.外部函数的返回值必须是内嵌函数
闭包的作用
作用1:闭包将外层函数内的局部变量和外层函数的外部连接起来。
作用2:将外层函数的变量持久地保存在内存中
一般来说,函数内部的局部变量在这个函数运行完以后,就会被Python的垃圾回收机制从内存中清除掉,但下面代码中,outer是inner的父函数,F=outer()将inner赋值给了全局变量F,因此inner始终会在内存中,inner依赖outer,因此outer也会一直在内存中,不会被回收掉
def outer():
x = 1
def inner():
print(x)
return inner
F = outer() #获取了inner函数对象
F() #执行inner函数
注:由于闭包会使得函数中的变量都被保存在内存中,会增加内存消耗,滥用闭包会造成程序的性能问题,可能导致内存泄露
闭包的使用
实例1:函数每次传入一个数字,对数字进行累加操作
这里需要在函数内部对函数外部的变量sum进行操作,可以通过global声明全局变量来实现,但因为全局变量在其他地方也都可以访问到,不推荐使用
sum = 0
def get_sum(num):
global sum
sum += num
return sum
print(get_sum(1)) # 输出:1
print(get_sum(2)) # 输出:3
print(get_sum(3)) # 输出:6
print(sum) # 输出:6
另一个方式就是通过闭包来实现
nonlocal声明sum为外层函数的变量
sum = 0
def get_sum(sum):
def add_num(num):
nonlocal sum
sum += num
return sum
return add_num
add = get_sum(sum)
print(add(1)) # 输出:1
print(add(2)) # 输出:3
print(add(3)) # 输出:6
print(sum) # 输出:0