Python代码中,可以定义嵌套函数,即在函数中再定义一个函数。嵌套函数有什么特别之处吗?因为闭包。
简单说,闭包就是嵌套的内层函数能够记住外层函数的namespace,在外层函数返回之后,内层函数还可以正常访问外层的这些变量。看如下代码:
def outer():
msg = 'hello world'
def inner():
print(msg)
return inner
>>> func = outer()
>>> func()
hello world
闭包有2个特点:
- inner能访问outer及其祖先函数的命名空间内的变量(局部变量,函数参数)。
- 调用outer已经返回了,但是它的命名空间被返回的inner对象引用,所以还不会被回收。
这部分想深入可以去了解Python的LEGB规则。
Python有了闭包,就可以创建函数的装饰器了。