闭包
⑴ 定义
函数中嵌套了一个函数。最外层的函数我们称为“外部函数”,嵌套在内的函数我们称为“内部函数”。内部函数中引用了外部函数的变量,但不能引用全局变量,且外部函数的返回值为内部函数的函数名。此时,便构成了一个闭包。
(如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。
闭包:
在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包)
简言之,当函数满足以下结构时,我们可以将其视为闭包。
def outer_function():
"""
外部函数
"""
outer_var = value # 定义变量 outer_var,value可以是任何值
def inner_function():
"""
内部函数
"""
print('引用变量:', outer_var) # 引用外部函数的变量
return inner_function # 外部函数的返回值为内部函数名
⑵ 必需条件
必须存在函数嵌套。
内部函数必须引用外部函数的变量。
内部函数必须不能引用全局变量。
外部函数的返回值必须是内部函数的函数名。
⑶ 变量内存的释放
通常情况下,当一个函数运行结束,函数内部的所有东西都会释放掉,还给内存,函数的局部变量也会因此消失。然而,闭包是一种特殊情况,如果外部函数在结束时发现其变量会在内部函数中被使用,就会把这个变量绑定给内部函数,然后再结束自己的运行。
⑷ 简单闭包的举例
⑸ 闭包的特有属性
只要是闭包,都有 __closure__
属性。该属性返回闭包应用外围作用域(即外部函数中)的变量内存地址,结果是一个元组。语法为:外部函数().__closure__
。
如果函数不是闭包,则 __closure__
返回“None”。
可以通过打印 外部函数().__closure__[数字].cell_contents
来获取外部函数变量的值。其中,“数字”即为元组元素的索引,从0开始。
例如: