闭包的认识

一、什么是闭包

  • 1、在函数编程中经常用到闭包。闭包是什么,它是怎么产生的及用来解决什么问题呢。给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境,简单点就是:函数内使用了函数外的变量)。
  • 2、在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
  • 3、一般情况下,在我们的认知当中,如果一个函数结束,函数的内部所有东西都会被释放,还给内存,然后回收,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,这个临时变量绑定给内部函数,然后自己再结束。

二、几种常见的闭包

  • 1、函数内使用全局变量

    a = 25
    
    def outer(a):
        def inner(b):
            return a + b
    
        return inner
    
    if __name__ == "__main__":
        f = outer(a)
        # 如果当前函数是闭包就可以打印出东西,不然就None
        print(f.__closure__)
        # (<cell at 0x1058c56a8: int object at 0x1056f0bd0>,)
    
  • 2、内部函数使用外部函数的变量

    def f1():
        a = 10
    
        def f2():
            return a
    
        return f2
    
    if __name__ == "__main__":
        f = f1()
    
        print(f.__closure__)
    

三、闭包的应用

  • 1、利用闭包中变量不销毁原理,记住上一次值

    origin = 0
    
    def outer(pos):
        def inner(step):
            nonlocal pos
            new_pos = pos + step
            pos = new_pos
            return new_pos
    
        return inner
    
    if __name__ == "__main__":
        f = outer(origin)
        print(f(2))
        print(f(4))
    
  • 2、nonlocal表示使用当前环境下的变量

results matching ""

    No results matching ""