闭包(closure)是指包含自由变量(free variable,未绑定到特定对象)的代码块,子函数可以使用父函数中的局部变量(即闭包中的自由变量)
PS:闭包就是一个函数及它上下文环境组成的一个整体,函数内可以使用环境中(函数外)的变量。
def make_averager():
series = []
def averager(new_value):
series.append(new_value)
return sum(series) / len(series)
return averager
def make_averager_():
count = 0
total = 0
def averager(new_value):
nonlocal count, total # 定义为自由变量,不能使用global
count += 1
total += new_value
return total / count
return averager
if __name__ == "__main__":
avg = make_averager_()
print(avg(1))
print(avg(2))
print(avg(3))
以上,每个外层函数体内的全部内容可以看成一个闭包。
另外延伸出关键字nonlocal和global的区别,nonlocal只能修饰局部变量(例如函数内申明的某变量),不能修饰全局变量;global刚好相反,只能修饰全局变量,不能修饰局部变量。
count = 1
def outer():
# nonlocal count # 报错
global count
count += 1
outer()
print(count)
另外,也可以不使用nonlocal关键字,而是借助列表可变对象的性质,将count = 1改成count = [1]
练习题:lc99. 恢复二叉搜索树