闭包: 闭包指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。
例子:
def make_averager():
series = []
def averager(new_value):
series.append(new_value)
total = sum(series)
return total/len(series)
return averager
avg = make_averager()
print(avg(10)) #10
print(avg(11)) #10.5
print(avg(12)) #11
按以往的常识来说, make_averager() 中的series 随着return 语句结束, 应该出栈, 但这里却可以继续保存值, 并且 参与到内部函数的计算中.
原因 :
1) make_averager 函数已经返回了,而它的本地作用域也一去不复返了, 但是series在averager()函数中是自由变量(free variable). 自由变量指未在本地作用域中绑定的变量
2) 通过打印avg的自由变量,
print(avg.__code__.co_freevars) #('series',)
发现avg中存在自由变量series
故 series 绑定在返回的 avg 函数的 __closure__ 属性中, 内部函数依旧可以使用它
综上,闭包是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用那些绑定
注: 只有嵌套在其他函数中的函数才可能需要处理不在全局作用域中的外部变量
参考文献: 《fluent Python》 --7.5