名称空间与作用域

一、定义

  用于存放变量名与变量值绑定关系的地方

二、名称空间的分类

  1、内置名称空间

    python解释器提前定义好的。如print()、len()

  2、全局名称空间

    在py文件中顶格编写的代码运行之后都会存入全局名称空间

name = 'jason'  # name全局


def func():  # func全局
    pass


if 1:
    a = 123  # a全局

for i in range(10):
    print(i)  # i全局

print(i)

  3、局部名称空间

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

  4、存活周期

    4.1、内置名称空间

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

    4.2、全局名称空间

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

    4.3、局部名称空间

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

三、名字的查找顺序

  1、在查找名字的时候,要先确认自己当前在哪

    1、如果你在局部,查找的顺序就是

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

    2、如果你在全局,查找顺序是

        全局 >>> 内置

  2、局部名称空间的嵌套

x = 111
def f1():
    x = 222
    def f2():
        x = 333
        def f3():
            x = 444
            def f4():
                x = 555
                print(x)  # 结果为555

            f4()
        f3()
    f2()
# 通过调用f1 执行所有的函数
f1()

 四、名称空间的作用域

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

    内置名称空间:程序任何阶段任何位置均可使用(全局有效)

    全局名称空间:程序任何阶段任何位置均可使用(全局有效)

    局部名称空间:一般情况下只在各自的局部名称空间中有效

五、global与nonlocal关键字使用

    1、global使用

      局部修改全局数据:如果数据为不可变类型则需要关键字global声明;如果数据为可变类型则无需要关键字global声明。

x = 111
def index():
    # 局部修改全局变量 需要使用关键字声明
    global x
    x = 222
index()
print(x)


name_list = ['jason', 'kevin']
def index():
    name_list.append('heiheihei')
index()
print(name_list)

    2、nonlocal使用

      如果想要在内部的局部修改外部局部的不可变数据类型,需要关键字nonlocal声明。

def index():
    x = 111
    def func():
        # 内部局部修改外部局部
        nonlocal x
        x = 222
    func()
    print(x)
index()

 

posted @ 2021-11-15 15:39  那就凑个整吧  阅读(32)  评论(0编辑  收藏  举报