py小强

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

什么是闭包?\

我们先举个栗子:
在外部调用函数的内嵌函数(一般情况下函数的内嵌函数在外面是不可见的)

def outer():
    a1 = 'test arg'

    def inner():
        print('inner', a1)

    return inner  # 注意,这里返回的是inner函数的内存地址,而不是执行结果。执行结果需要带()。


func = outer()  # outer()的执行结果返回inner的内存地址,相当于inner

func()  # 这里func加()相当于inner()。这样就可以在外部调用内部的函数了。

原则上,函数执行完毕,函数的全部变量应该释放。
但是上述的例中,outer执行完后,a1变量并没有释放。
这是为什么呢?

因为内嵌函数inner()在外部被func()调用,使得enclosing函数outer()的作用域不能释放。
所以inner()的返回值依然可以调用outer()的a1变量。\

在一个函数中定义了另外一个函数,内部函数里调用了外部函数的临时变量,
并且外函数的返回值是内函数,这样就构成了一个闭包。

  • 特点:

    • 必须有一个内嵌函数
    • 内嵌函数必须引用外部函数中的变量
    • 外部函数的返回值必须是内嵌函数
  • 闭包的意义:返回的内嵌函数对象不仅是一个函数对象,在该函数外还包裹一层作用域(enclosing),
    这使得该函数无论在何处调用,有限使用自己外层包裹的作用域。
    使用闭包,可以隐藏内部函数的工作细节,只给外部使用者提供一个可以执行的内部函数的调用。

posted on 2019-06-24 14:32  py小强  阅读(151)  评论(0)    收藏  举报