闭包
闭包是嵌套函数中作用域归属的一种体现
def outer():
name = "我是外部函数的变量"
def inner():
print(name)
return inner # 注意返回的是函数名,不带括号.这里只是返回inner的内存地址,并未执行
f = outer()
f() # 相当于执行的是inner()
输出结果:我是外部函数的变量
对于这种现象有何感想:
现象:
- outer()函数内部嵌套定义的内部函数inner()调用了outer的变量
- outer()函数没有调用内部函数inner(),而是通过return的方式返回到函数outer()外部
- 注意,函数outer()返回的是 inner,而不是inner(),因此并没调用内部函数inner()
- 内部函数inner()在外部函数outer外被调用,即调用 f()
- 此时,按理说outer函数已经通过return的使用,结束了其自身的,释放了其内存空间,即name亦被释放
- 但是,程序的执行结果却表明,name依然存在且被调用执行
解释:
- 闭包的原因:
- 返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域