python技巧

Python闭包

2018-09-04  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读