闭包其实就是在函数(外部函数)内部添加一个函数(称为内部函数),内部函数使用外部函数的临时变量,并且外部函数的返回值是内部函数的引用。
例如:
#outer是外部函数 a和b都是外函数的临时变量
def outer( a ):
b = 10
# inner是内部函数
def inner():
#在内函数中 用到了外函数的临时变量
print(a+b)
# 外函数的返回值是内函数的引用
return inner
if __name__ == '__main__':
#我们调用外部函数,传入参数1
test1=outer(1)
#调用
test1()
#返回结果为11
那么问题来了,我们怎么修改外部函数的变量呢?
1 ,在python3中,可以用nonlocal 关键字声明 一个变量, 表示这个变量不是局部变量空间的变量,需要向上一层变量空间找这个变量。
2, 在python2中,没有nonlocal这个关键字,我们可以把闭包变量改成可变类型数据进行修改,例如列表。
def outer( a ):
b = 10 # a和b都是闭包变量
c = [a] #这里对应修改闭包变量的方法2
# inner是内函数
def inner():
#内函数中想修改闭包变量
# 方法1 nonlocal关键字声明
nonlocal b
b+=1
# 方法二,把闭包变量修改成可变数据类型 比如列表
c[0] += 1
print(c[0])
print(b)
# 外函数的返回值是内函数的引用
return inner
if __name__ == '__main__':
test1 = outer(1)
test1()
#返回值为2,11
还有一点需要注意:使用闭包的过程中,一旦外函数被调用一次返回了内函数的引用,虽然每次调用内函数,是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量
例如:
def outer(x):
def inner(y):
nonlocal x
x+=y
return x
return inner
a = outer(10)
print(a(1)) //11
print(a(3)) //14