闭包( Closure )是一种重要的语法结构, Python 支持闭包这种结构。
如果一个内部函数引用了外部函数作用域中的变量,那么这个内部函数就被称为闭包。
被引用的变量将和这个闭包函数一同存在,即使离开了创建它的外部函数也不例外。所以,闭包是由函数和与其相关的引用环境组合而成的实体。
在 Python 中创建一个闭包需要满足以下条件:
- 闭包函数必须有嵌套函数。
- 嵌套函数需要引用外部函数中的变量。
- 外部函数需要将嵌套函数名作为返回值返回。
例 6-15 闭包示例:
def greeting_conf(prefix):
def greeting(name):
print(prefix,name)
return greeting
mGreeting = greeting_conf("Good Morning")
mGreeting("Wilber")
mGreeting("Will")
print()
aGreeting = greeting_conf("Good Afternoon")
aGreeting("Wilber")
aGreeting("Will")
第7行的变量 mGreeting 指向 greeting _ conf ()函数,实际引用的是闭包函数greeting()占用的内存空间。
所以,语句greeting_conf(“Good Morning”)实际上执行的是 greeting ()函数。
从变量生命周期的角度来讲,在 greeting_conf() 函数执行结束以后,变量(参数) prefix 已经被销毁了。
greeting _ conf 函数执行完后,因为返回值是内部函数greeting(),会再次执行内部的 geeting ()函数。由于 greeting ()函数使用了 prefix 变量,所以程序应该出现运行时错误。
然而,程序却能正常运行,这是为什么呢?
究其原因,主要在于函数闭包会记得外层函数的作用域,在 greeting() 的函数(闭包)中引用了外部函数的 prefix 变量,所以程序是不会释放这个变量的。
|