名称空间和作用域

#变量名和内存地址对应的表叫做名称空间

# 内置名称空间:(python启动时就有,python自带的)python解释器内置的名字,print,max,min

# 全局名称空间:(执行python文件时启动,包括if判断得出的结果)定义的变量

# 局部名称空间:(调用函数时启动,调用结束失效)函数内部定义的变量

# 总结:三者的加载顺序

# 内置 - -->全局 - -->局部

# 三者的访问顺序

# 局部 - -->全局 - -->内置

一、函数之名称空间

        1.1、什么是名称空间

        名称空间:存放名字的地方

        例子:S=1,1存放于内存中,那名字 S 存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方

        1.2、名称空间 (存放名字与值的绑定关系)

        1、内置名称空间

            存放python解释器自带名字,比如内置的函数名:len,max,sum

            创建:随着python解释器启动而创建

            销毁:随着python解释器关闭而销毁

       2、全局名称空间

存放文件级别的名字,比如x,f1,z
x=1

 def f1():
    y=2
    if x == 1:
        z=3    

            创建:文件开始执行时则立即创建

            销毁:文件开始执行完毕时则销毁

        3、局部名称空间

            存放函数内的名字,强调:函数的参数也属于局部的

            创建:函数执行时才临时创建

            销毁:函数执行完毕则立即销毁

        4、名称空间的加载顺序

            内置名称空间--->全局名称空间--->局部名称空间

            强调:加载的目的是为了把名字存起来,存起来的目的是为了取出来,那么但凡查找一个名字一定会从三种名称空间之一找到。

        5、名称空间的查找名字顺序

            局部名称空间===>全局名称空间===>内置名称空间

    例子:名称空间加载顺序与名称空间查找名字顺序使用案例

len=10
def f1():
    # len=100
    def f2():
        # len=1000
        def f3():
            # len=10000
            print(len)
        f3()
    # len=200
    f2()
len=11111111111    #这里相当于修改了全局定义的'len=10',修改为'len=11111111111'
f1()

len=11111111111

  函数的查找关系是在函数定义阶段就已经固定死的,与调用位置无关

 # 函数名字的查找关系是在函数定义阶段就已经固定死的,与调用位置无关

x=100
def f1():
    x=10
    print(x)

def f2():
    x=111111
    f1()
f2()

>>:10

二、作用域

        全局范围:内置名称空间中的名字,全局名称空间中的名字

            特点:全局有效,全局存活

        局部范围:局部名称空间中的名字

            特点:局部有效,临时存活

        全局变量:定义在全局作用域的名字

        局部变量:定义在局部作用域的名字

        2.1、当全局数据类型是可变类型时,在函数内是可以修改的

l=[]             #全局类型(可变数据类型)
def foo1():
    l.append(2)  #在函数内往全局类型里面追加数据
foo1()
print(l)         
>>:[2]              #追加完毕后,全局类型l的值已经为[2]
        2.2、当全局数据类型是不可变类型时,在函数内不能修改

L=100             #全局类型(不可变类型)
def foo1():
    L=222         #在函数内定义L的值为222
foo1()
print(L)
>>:100           #执行后全局类型L的值并没有被修改
原文地址:https://www.cnblogs.com/leeeel/p/10816128.html