Effective Python:(18)作用域问题
Effective Python第21条说的是如何在闭包里使用外围作用域的变量,这也是我们编程常遇到的问题。
说起来比较简单,就是如何在内层的方法中使用外层方法的变量,就是局部变量的作用域的问题熟悉C语言的知道,是不能直接用函数外的局部变量的,需要通过参数传递,或者直接做成全局变量。
但是Python有闭包的概念,可以让内层方法直接引用外层方法的变量,可以读取其值,但是给外层变量赋值,会出现情况,发现无法赋值成功,这是因为内层函数当做新定义一个变量处理了,与外层变量无关。
要解决赋值的问题,可以给内层方法里改变量声明成nonlocal,这样就是告诉Python我们要把值赋值给闭包外部的变量。当然这样写有时候会使程序难以理解,这样情况我们就可以封装一个辅助类来完成,用类的self指针直接当做引用类的成员变量。