查看官方解释,闭包看起来确实不好理解,我通过查资料将闭包做一个通俗的解释:闭包是函数里面再次定义一个函数,外部的函数暂且称为外函数,内部的函数暂且称为内函数。外函数的返回值为内函数和它的环境,它的环境就是外函数的局部变量(也是内函数的外部变量)当前的值,比如当前变量的值,很多教程里将闭包的时候会用到下面这个例子(来自廖雪峰Python教程):
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count()
>>> f1, f2, f3 = count() >>> f1() 9 >>> f2() 9 >>> f3() 9
结果出乎意料,我们本来想得到的结果是1,4,9。为什么会出现这种情况呢?
因为闭包不是立刻执行的,等调用的时候,也就是输入f1()的时候才执行,我们说过,闭包返回的是函数和它的环境,思考一下,定义f1,f2,f3的时候返回的是什么?是不是f()函数和它的环境(i=3),因为内函数不立刻执行,但是外函数是执行的,等执行完后i=3,所以内函数的环境就是i=3,如果有多个变量,那么环境更复杂。那么这个问题如何解决呢?请看下面的代码:
def count(): fs = [] for i in range(1, 4): def f(y=i): return y*y fs.append(f) return fs f1, f2, f3 = count() print(f1(),f2(),f3())
只要每次用y记住当前的变量i就行,也就是记住咱们想让他记住的时刻,如i=1,i=2,i=3的时刻,这样,f1的时候,返回的是函数f和y=1,f2的时候返回的是函数f和y=2......所以此时就可以得到结果1,4,9.不信可以try。
python通俗易懂的闭包
最新推荐文章于 2024-02-23 20:28:31 发布