美文网首页我爱编程
Python中的闭包

Python中的闭包

作者: 快乐的bug制造者 | 来源:发表于2018-04-15 22:19 被阅读59次

    php对闭包的定义是匿名函数,我之前对python闭包的理解是:外部函数以内部函数作为返回值,称之为闭包!!!(错的,1、不是以内部函数作为返回值,是返回内部函数的引用;2、闭包是对变量作用域的应用)
    最近在重新看Python一些基础的东西,突然发现之前自己对python闭包的概念理解是特么错的!

    在解释闭包之前,先说一个定义:Python中如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。

    闭包:

    在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。(要知道必须要用到外部的函数临时变量才能称之为闭包,闭包是对变量作用域的应用,而不是简单地返回一个函数)

    有点青涩难懂,上代码吧:

    # outer是外部函数 a和b都是外函数的临时变量(你也可以称之为环境变量)
    def outer( a ):
        b = 10
        # inner是内函数
        def inner():
            #在内函数中 用到了外函数的临时变量
            print(a+b)
        # 外函数的返回值是内函数的引用
        return inner
    
    if __name__ == '__main__':
        # 在这里我们调用外函数传入参数5
        #此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo
        # 外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数
        demo = outer(5)
        # 我们调用内部函数,看一看内部函数是不是能使用外部函数的临时变量
        # demo存了外函数的返回值,也就是inner函数的引用,这里相当于执行inner函数
        demo() # 15
    
        demo2 = outer(7)
        demo2()#17
    

    如何在闭包的内部函数修改外部函数的临时变量:

    1、在python3中,可以用nonlocal 关键字声明 一个变量, 表示这个变量不是局部变量空间的变量,需要向上一层变量空间找这个变量。

    2、使用可变类型数据,比如list和dict!

    # outer是外部函数 a和b都是外函数的临时变量
    def outer( a ):
        b = 10  # a和b都是闭包变量
        c = [a] #这里对应修改闭包变量的方法2
        # inner是内函数
        def inner():
            #内函数中想修改闭包变量
            # 方法1 nonlocal关键字声明
            nonlocal  b
            b+=1
            # 方法二,把闭包变量修改成可变数据类型 比如列表
            c[0] += 1
            print(c[0])
            print(b)
        # 外函数的返回值是内函数的引用
        return inner
    
    if __name__ == '__main__':
    
        demo = outer(5)
        demo() # 6  11
    

    还有一点需要注意:
    使用闭包的过程中,一旦外函数被调用一次返回了内函数的引用,虽然每次调用内函数,是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量

    def outer(x):
        def inner(y):
            nonlocal x
            x+=y
            return x
        return inner
    
    a = outer(10)
    print(a(1)) //11
    print(a(3)) //14
    

    相关文章

      网友评论

        本文标题:Python中的闭包

        本文链接:https://www.haomeiwen.com/subject/wovrkftx.html