本条内容比较多,我分了两篇来写:
上一篇在这:https://editor.csdn.net/md/?articleId=112461408
上一篇内容主要是不能在内部函数中直接给外部函数的的变量附值,如果要附值可以用nolocal的方法。但是nolocal方法也有问题,由他产生的bug难以调试。一是,过度的用nolocal可能会在不必要的时候修改了外部变量;二是在外部定义变量的位置、nolocal定义位置、变量使用位置三者的跨度会很大,导致代码难以理解阅读。
所以nolocal的代码要保持简单,如果已经越来越复杂,那就应该用类来实现。比如 :
class Sorter(object):
def __init__(self,group):
self.group = group
self.found = False
def __call__(self,x):
if x in self.group:
self.found = True
return(0,x)
return(1,x)
numbers = [8,3,1,2,5,4,7,6]
group = {2,3,5,7}
sorter=Sorter(group)
numbers.sort(key=sorter)
print(sorter.found)
这段代码的倒数第二行比较难理解,不过如果知道了__call__的用法也就能理解了。
要点:
- 对于定义在作用域内的闭包来说,它可以引用这些作用域中的变量。
- 使用默认方式 对闭包的变量赋值,不会影响外围作用域中的同名变量。
- 在python3中,程序可以在闭包内用nolocal语句来修饰某个名称,使该闭包能够修改外围作用域中的同名变量。
- 除了那种比较简单的函数 ,尽量不要用nonlocal语句。
最后一点吐槽:闭包这个词难以理解 ,不知道最开始是谁翻译的。