Python闭包

作者: 陆_志东 | 来源:发表于2018-09-04 08:12 被阅读0次

    什么是闭包?
    闭包就是在一个函数内部再创建一个函数,内部的函数引用外部函数的变量,变量和内部的函数加起来成为闭包,闭包不会影响全局变量

    Python变量的查找顺序是:
    当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量
    注意事项:如果闭包引用的变量是不可变类型,需要使用nonlocal声明,最好无论是不是可变类型,都使用nonlocal声明一下,nonlocal的作用是引用外部的非全局变量,作用于闭包内部,global是当你想要在函数内部的作用域中想要修改全局的变量时,需要使用global

    def outer(start):
        def inner():
            nonlocal start
            start += 1
            return start
        return inner
    
    
    def outer1(start):
        def inner():
            start[0] += 1
            return start
        return inner
    
    
    run = outer(10)
    print(run())
    >>11
    print(run())
    >>12
    run1 = outer1([1])
    print(run1())
    >>[2]
    print(run1())
    >>[3]
    print(start)  # 会报没有定义的错误
    

    比较nonlocal和global

    def scope_test():
        def do_local():
            spam = "local spam" #此函数定义了另外的一个spam字符串变量,并且生命周期只在此函数内。此处的spam和外层的spam是两个变量,如果写出spam = spam + “local spam” 会报错
        def do_nonlocal():
            nonlocal  spam        #使用外层的spam变量
            spam = "nonlocal spam"
        def do_global():
            global spam
            spam = "global spam"
        spam = "test spam"
        do_local()
        print("After local assignmane:", spam)
        do_nonlocal()
        print("After nonlocal assignment:",spam)
        do_global()
        print("After global assignment:",spam)
     
    scope_test()
    print("In global scope:",spam)
    
    输出结果:
    >>After local assignmane: test spam
    >>After nonlocal assignment: nonlocal spam
    >>After global assignment: nonlocal spam
    >>In global scope: global spam
    

    在闭包中使用global会修改最外层的全局变量

    def add_b():
        global  b
        b = 42
        def do_global():
            global  b    # 如果去掉这句 会报错,这是因为global的全局变量,在函数内部职能引用不能修改,想修改也要global
            b = b + 10
            print(b)
        do_global()
        print(b)
    add_b()
    print(b)
    输出结果:
    >>52
    >>52
    >>52
    

    相关文章

      网友评论

        本文标题:Python闭包

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