我们在函数编程中,很多语言都用到了闭包这一概念,那什么是闭包呢

概念

  • 内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包
  • 一个闭包就是你调用了内部函数,外部函数返回内部函数。此时的内部函数就叫做闭包函数
  • 闭包在运行时可以又多个实例,不同的引用环境和相同的函数组合可以产生不同的实例

哈哈,是不是感觉更懵了,看段代码理解一下吧

def wai():
    a=1
    def nei();
        print(a)
    return nei

>>> wai()
1

nei()函数引用了wai()函数里的a变量,此时nei()函数就是一个闭包函数。外部函数的返回值就是内部函数的引用。所以调用外部函数会引用内部函数,然后打印出外部函数变量的值


深入理解

我们再来一段代码

def func(num):
    def func1(num1):
        print(num+num1)
    return func1

>>> var=func(10)
>>> var(20)
30

我们让var来当func()函数的返回值,也就是func1()函数。调用func(10)函数,num的值是10,引用内部函数var(20)也就是func1(20),输出num+num1的值

如果加入列表呢

mylist=[1,2,3,4,5]
def func(obj):
    def func1():
        obj[0]+=1
        print(obj)
    return func1

>>> var=func(mylist)
>>> var()
[2,2,3,4,5]

在面对一个可变对象时,闭包还可以维持变量的状态,延长生命周期


思考

  • 闭包函数类似于类生成实例,闭包私有化了变量,原来需要类对象完成的工作,闭包也可以完成
  • 由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
  • 在python中,使用闭包的另一个场景就是装饰器,也叫语法糖