在Python中,闭包是指了延伸作用域的函数,能够访问和引用非定义体中定义的非全局变量。这句话乍看上去难以理解,下面我用一个例子来说明。
计算累计值的和。
我们使用一个高阶函数,所谓高阶函数,即可以将其他函数当作参数传入,或当作结果返回的函数。
def total_sum():
sums=[]
def get_sum(value):
sums.append(value)
return sum(sums)
return get_sum
然后在控制台测试:
>>> s=total_sum()
>>> s(10)
10
>>> s(20)
30
>>> s(9)
39
>>> s(3)
42
每调一次函数,就会产生之前累计的和。功能已经实现,现在来分析过程:
sums 是 total_sum 函数的局部变量,因为那个函数的定义体中初始化了 sums = []。可是,调用 sum(10)时,total_sum函数已经返回了,而它的本地作用域也就随之消失了。
然而,在get_sum 中,sums是一个自由变量,即未在本地作用域中绑定的变量。如下图所示:
利用python中__code__属性,我们可以查看到函数保存的局部变量和自由变量。如下:
>>> s.__code__.co_varnames
('value',)
>>> s.__code__.co_freevars
('sums',)
所以,闭包是一种函数,它延伸了自身的作用域,会保留定义函数时存在的自由变量的绑定,能引用外部非全局变量。但是,只有嵌套在其他函数中的函数才可能需要处理不在全局作用域中的外部变量。