闭包
看一个示例:
内层函数我们的语句块为: c[0] += 1 ,即 c[0] = c[0] + 1 ,这里并没有赋值,而是对外层函数中的一个列表做的一个引用
这里便是闭包,c便是一个自由变量,便是定义在内层函数外的一个变量,且在内层函数中去引用,而不是重新赋值
而我们即使在外部重新定义了c,但是这个函数调用的却是一个自由变量,外部并不可见
再看一个示例:
这个函数肯定会报错,因为我们对count重新赋值,所以我们可以使用global将count定义成全局变量便可以解决:
我们如果只是在内层函数里使用global指定好,但是依然会报错,我们还需要在最外层定义一个变量,因为在外部并无该变量存在。
但是如果想让该函数成为闭包,我们可以使用nonlocal来实现
我们这里使用nonlocal标记为不再本地作用域中,而是在上一级局部作用域中定义,但不能是全局作用域中的变量