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 @   cheng4632  阅读(163)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2020-04-03 02python基础----控制流程
点击右上角即可分享
微信分享提示