nonlocal作用:
Python 3 引入了 nonlocal 声明。它的作用是把变量标记为自由变量, 即使在函数中为变量赋予新值了,也会变成自由变量。如果为 nonlocal 声明的变量赋予新 值,闭包中保存的绑定会更新。主要应用在闭包中,将不可变类型的数据变为自由自由变量,对于可变类型的数据,在闭包中就没有必要用到这个参数了,这也很好理解,有这样的区别,主要是函数作用域的问题所引起的,对于可变类型,只是一个引用(地址)所以没有作用域的问题。
自由变量:
这是一个技术术语,指未在本地 作用域中绑定的变量。这也很好理解,如字面意思,其变量是自由的,不会再函数的因作用域的问题变为局部变量。
例如:
def make_averager():
count = 0
total = 0
def averager(new_value):
count += 1
total += new_value
return total / count
return averager
对于上面这个例子其实是有问题的,因为python的编译规则使得其中定义的变量(count ,total )变为局部变量,而闭包在执行的时候他会抛弃本地作用域的东西(因为在调用外部函数的时候,函数已经返回。)
解决在代码中加上nonlocal声明就可以了。
def make_averager():
count = 0
total = 0
def averager(new_value):
nonlocal count, total
count += 1
total += new_value
return total / count
return averager
结果: