16函数---嵌套、作用域、global、nonlocal

1、函数嵌套

def f1():
    def f2():
        def f3():
            print('cc')
        f3()
    f2()


f1()

 

2、作用域

python创建、改变或查找变量名都是在所谓的命名空间中进行的,
当我们谈论搜索变量名对应代码的值时,作用域这个术语指的就是命名空间。

作用域和定义的时候有关系,和在哪里调用没有关系

变量名解析:LEGB规则

L:Local,本地作用域,函数定义了本地作用域,即函数内的名字空间
E:Enclosing function locals,外部嵌套函数的名字空间(例如closure),或lambda的本地作用域
G:Global(module),全局作用域,所在模块(文件)的名字空间
B:Built-in,内置模块的名字空间

3、glocal语句:

如果局部要对全局变量修改,则在局部声明该全局变量
如果局部不修改全局变量,只是引用,则不用声明
如果有多处

a= 1
def f():
    #如果需要在函数内定义(修改)全局变量,则要先用global进行声明,直接 a += 1 会报错,如果只是引用的话,则不用global声明
    # 如果修改的是不可变类型,那么必须global声明,如果修改的是可变类型,那么不用声明,修改会直接返回到原值
    global a
    a += 1  #如果只是查看的话,则不用global声明,
    print(a)

f()

 

如果修改的是可变类型,那么不用声明,修改会直接返回到原值
l = [1,2]
def f(l):
    l.append(3)#这是修改的是可变类型,不用golbal声明
    return l

print(f(l))

 

4、nonlocal语句

nonlocal : 用来在函数或其他作用域中使用外层(非全局)变量
对于多层嵌套函数,使用nonlocal声明,会从当前函数层的外层开始寻找,一直到最外层,不会找到全局变量

x = 2
def f1():
    x = 3
    def f2():
        x = 4
        def f3():
            nonlocal x # 去当前层的上一层去找,
            x += 1
        f3()
        print(x) # 5
    f2()
    print(x) # 3

f1()
print(x)#全局变量不会被修改, 2

 






posted @ 2021-04-03 17:59  cheng4632  阅读(178)  评论(0)    收藏  举报