> 文档中心 > python的名称空间和作用域

python的名称空间和作用域


python的名称空间和作用域


内存:栈区+堆区,栈区存放的是变量名(内存地址),堆区存放的是变量值与栈区的变量名是映射关系(绑定关系)
名称空间:是虚拟概念,是对栈区的划分,本质还是存放变量名,只不过是对变量进行分区管理。
作用域:名称空间的向上砖取,也就是总结归类。

python的名称空间和作用域

1、名称空间

名称空间namespacs:存放名字的地方,是对栈区的划分
注:有了名称空间之后,就可以在栈区中存放相同的名字

1.1 内置名称空间

存放的名字:存放的python解释器内置的名字:内置函数等
存活周期:python解释器启动则产生,python解释器关闭则销毁

print(print)    # print(input)    # print(max)      # # built-in 内建

1.2 全局命名空间

存放的名字:只要不是函数体定义、也不是内置的,剩下的都是全局名称空间的名字
存活周期:python文件执行则产生,python文件运行完毕后销毁

x = 10     # x全局名称if 1:    y = 20 # y全局名称    if 2: z = 30    #  z全局名称print(x,y,z)      # 10 20 30while 1:      a = 40# a全局名称     breakprint(a)    # 40def func():     # func全局名称    passclass A: # A全局名称    pass

1.3 局部名称空间

存放的名字:在调用函数时,运行函数体代码过程中产生的函数内的名字
存活周期:在调用函数时存活,函数调用完毕后则销毁

def func():     # 全局名称空间    x = 12      # 局部名称空间    y = 20      # 局部名称空间    func()注:名称空间的"嵌套"关系是以函数定义阶段为准,与调用位置无关

1.4 名称空间的加载、销毁顺序

加载顺序:内置名称空间(打开python解释器立马产生)> 全局命名空间(执行py文件时产生)> 局部名称空间(调用函数时产生)
销毁顺序:局部名称空间(调用函数结束销毁)> 全局命名空间(py文件执行j结束销毁)> 内置名称空间(关闭python解释器销毁)
注:一个程序中局部名称空间名称空间可以有多个,每调用一次函数产生一个独立空间;内置、全局名称空间只有一个。

1.5 名字的查找优先级

当前所在的位置向上一层一层查找

1.5.1 当前在局部名称空间

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

max = 10def func():    max = 20    print(max)  # 20,打印局部max=20func()max = 10def func():    # max = 20    print(max)  # 20,打印全局max=10func()# max = 10def func():    # max = 20    print(max)  # ,打印内置max函数func()

1.5.2 当前在全局名称空间

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

max = 1print(max)  # 1# max = 1print(max)  # 

2、作用域

2.1 全局作用域

全局作用域:内置名称空间,全局名称空间
全局存活:从py文件执行开始生效,整个执行过程都有效
全局有效:被所有函数共享

2.2 局部作用域

局部作用域::局部名称空间的名字
临时存活:调用函数时有效
局部有效:函数内有效

3、global

在局部修改全局的名字对应的值(不可变类型),需要用global,将局部作用域变成全局作用域

名称空间将内存栈区划分成三个区,向上砖取成两个作用域(全局作用域和局部作用域),两个作用域的名字互不影响,两个作用域出现相同的名字时,两个或多个相同的名字共存但是作用范围不同。

# 全局作用域和局部作用域互不影响x = 10  # 全局变量xdef func():    x = 20  # 局部变量x,在内置名称空间中从新存储x变量,不能改变全局变量y,新的func()print(x)    # 10# global,将局部变量申明成全局变量y = 10# 全局变量ydef func():    global y    # global将局部变量申明成全局变量,可以改变全局变量y,旧的    y = 20func()print(y)    # 20

3、nonlocal

修改函数外层函数包含的名字对应的值(不可变类型)

def func():    x = 20   # 局部x    def func1(): x = 30  # 局部x,处局部x与外层函数局部x不相同(互不影响,内存地址不同),新的    func1()    print(x)    # 20func()def func():    x = 20  # 局部x    def func1(): nonlocal x  # nonlocal,申明此处局部x与外层函数局部x相同(可以影响,内存地址相同),旧的 x = 30    func1()    print(x)    # 30func()