本文主要介绍什么是闭包,Ptyhon中使用闭包时容易出现的变量问题。
闭包
闭包指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。函数是不是匿名的没有关系,关键是它能访问定义体之外定义的非全局变量。
举个栗子
def make_averager():
series = []
def averager(new_value):
series.append(new_value)
total = sum(series)
return total/len(series)
return averager
avg = make_averager()
avg(10) # 10.0
avg(13) # 11.5
avg(19) # 14.0
上面定义了一个嵌套函数,作用是计算移动平均值。
调用make_averager
时,返回一个averager
函数对象。每次调用averager
时,会把一个新的参数值添加到列表中,然后计算列表的平均值。series
是make_averager
函数的局部变量,但是调用avg(10)
时,make_averager()
函数已经返回了,所以它的本地作用域也没有了。
在averager()
函数中,series
变成了自由变量,就是没在本地作用域中绑定的变量。