Python3.7之闭包
一、条件
1 在一个外函数中定义了一个内函数。
2 内函数里运用了外函数的临时变量。
3 并且外函数的返回值是内函数的引用。
一般情况下,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。
def outer():
name = 'alex'
def inner():
print("inner", name)
return inner
f = outer()
print(f)
f()
1 外函数返回了内函数的引用:
在外函数outer中 最后return inner,在调用外函数 f = outer() 的时候,outer返回了inner,inner是一个函数的引用,这个引用被存入了f中。所以接下来再进行使用f() 的时候,相当于使用了inner函数。
一个函数,如果函数名后紧跟一对括号,说明现在就要调用这个函数,如果不跟括号,只是一个函数的名字,里面存了函数所在位置的引用。
2 外函数把临时变量绑给内函数:
外部函数发现,自己的临时变量会在将来的内部函数中用到,自己在结束的时候,返回内函数的同时,会把外函数的临时变量和内函数绑定在一起。所以外函数已经结束了,调用内函数的时候仍然能够使用外函数的临时变量。
二、内函数修改外函数局部变量
在python3中,可以用nonlocal 关键字声明 一个变量, 表示这个变量不是局部变量空间的变量,需要向上一层变量空间找这个变量。
def outer():
name = 'alex'
def inner():
nonlocal name
name = name+' python'
print("inner", name)
return inner
f = outer()
print(f)
f()
'''
inner alex python
'''
注:使用闭包的过程中,一旦外函数被调用一次返回了内函数的引用,虽然每次调用内函数,是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量。