1 在一个外函数中定义了一个内函数。python
2 内函数里运用了外函数的临时变量。闭包
3 而且外函数的返回值是内函数的引用。函数
通常状况下,若是一个函数结束,函数的内部全部东西都会释放掉,还给内存,局部变量都会消失。可是闭包是一种特殊状况,若是外函数在结束的时候发现有本身的临时变量未来会在内部函数中用到,就把这个临时变量绑定给了内部函数,而后本身再结束。code
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函数。class
一个函数,若是函数名后紧跟一对括号,说明如今就要调用这个函数,若是不跟括号,只是一个函数的名字,里面存了函数所在位置的引用。变量
2 外函数把临时变量绑给内函数:引用
外部函数发现,本身的临时变量会在未来的内部函数中用到,本身在结束的时候,返回内函数的同时,会把外函数的临时变量和内函数绑定在一块儿。因此外函数已经结束了,调用内函数的时候仍然可以使用外函数的临时变量。co
在python3中,能够用nonlocal 关键字声明 一个变量, 表示这个变量不是局部变量空间的变量,须要向上一层变量空间找这个变量。return
def outer(): name = 'alex' def inner(): nonlocal name name = name+' python' print("inner", name) return inner f = outer() print(f) f() ''' inner alex python '''
注:使用闭包的过程当中,一旦外函数被调用一次返回了内函数的引用,虽然每次调用内函数,是开启一个函数执行事后消亡,可是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量。