名称空间

1.什么是名称空间(namespaces)

用于存放变量名与变量值绑定关系的地方(类似于民政局)

2.名称空间的分类(重要)

1.内置名称空间

python解释器提前给你定义好的

print()

len()

...

2.全局名称空间

除了函数体代码的局部名称空间和内置名称空间都是全局空间

3.局部名称空间

函数体代码运行之后产生的都是局部名称空间

3.存活周期

1.内置名称空间

​ python解释器启动与关闭而创建和销毁

2.全局名称空间

​ 随着py文件的运行与结束而创建和销毁

3.局部名称空间

​ 随着函数体代码的执行与结束而创建和销毁

4. 名字的查找顺序

在查找名字的时候 要先确定自己当前在哪

1.如果你在局部

局部 >>> 全局 >>> 内置

2.如果你在全局

全局 >>> 内置
image

局部名称空间的嵌套

函数在定义阶段名字的查找顺序就已经固定死了

x = 111
def f1():
    x = 222
    def f2():
        x = 333
        def f3():
            x = 444
            def f4():
                x = 555
                print(x)  
            f4()
        f3()
    f2()
# 通过调用f1 执行所有的函数
f1()  # 结果为 555

x = 111
def f1():
    x = 222
    def f2():
        x = 333
        def f3():
            x = 444
            def f4():
                print(x)
                x = 555
            f4()
        f3()
    f2()
# 通过调用f1 执行所有的函数
f1()  # 会报错,因为函数在定义阶段名字的查找顺序就已经固定死了,定义阶段在当前局部空间能找到555,但是定义阶段不运行代码,是没问题的,一旦运行代码,x=555取不到,不会去取上层的444,所以会报错

5. 名称空间的作用域

作用域
名称空间所能够作用的范围

内置名称空间
程序任何阶段任何位置均可使用(全局有效)
全局名称空间
程序任何阶段任何位置均可使用(全局有效)
局部名称空间
一般情况下只在各自的局部名称空间中有效

6. global与nonlocal关键字使用

image

如果想在局部修改全局数据

如果数据为不可变类型则需要关键字global声明

如果数据为可变类型则无需关键字global声明

image

def  f1():
    x=2
    def f2():
        nonlocal x
        x=3
    f2() #调用f2(),修改f1作用域中名字x的值
    print(x) #在f1作用域查看x
 
f1()  #结果 3
"""
如果想要在内部的局部修改外部局部的不可变类型数据
需要关键字nonlocal声明
"""
posted @   zong涵  阅读(48)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示