谈到装饰器(decorator),离不开闭包(closure)!
谈到闭包(closure),离不开Cell和Free Variable!
只要理解了Cell和Free Variable,那才算是真正地理解了闭包和装饰器!
什么是Cell和Free Variable
我们先来看Free Variable。我们知道Python的变量(variable)都是在某个作用域中的。这4个作用域你一定了解,local, nonlocal, global(module) 和 built-in。某个变量名在作用域中的查找顺序这里就不赘述了。我们可以说local variable, global variable等等。那free variable又是怎么回事呢?
Free Variable中的“Free”就是自由的意思。自由变量,说明这个变量不是属于之前提到的4个作用域中,它很“自由”。那Python又是怎么去引用它的呢?
Python是通过Cell间接引用Free Variable。
此处你一定有个疑问,为什么得通过Cell间接引用Free Variable?为什么不直接引用Free Variable?
那我们就看看闭包直接引用自由变量有什么问题。
如下图,如果只有一个闭包在引用自由变量,而且自由变量是属于不可改变(immutable)的类型,那我们必须得先创建一个值,然后再修改闭包中的引用地址去引用新值。