名称空间

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 @ 2021-11-15 21:43  zong涵  阅读(47)  评论(0编辑  收藏  举报