049 名称空间和作用域

一、名称空间

名称空间(name spaces):在内存管理那一章节时,我们曾说到变量的创建其实就是在内存中开辟了一个新的空间。但是我们一直在回避变量名的存储,其实在内存中有一块内存存储变量名与变量间的绑定关系的空间,而这个空间称为名称空间。

1.1 内置名称空间

内置名称空间:存放Pyhton解释器自带的名字,如int、float、len

生命周期:在解释器启动时生效,在解释器关闭时失效

1.2 全局名称空间

全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间,如下面代码中的x、func、l、z

生命周期:在文件执行时生效,在文件执行结束后失效

x = 1

def func():
    pass

l = [1, 2]

if 3 > 2:
    if 4 > 3:
        z = 3

1.3 局部名称空间

局部名称空间:用于存放函数调用期间函数体产生的名字,如下面代码的f2

生命周期:在文件执行时函数调用期间时生效,在函数执行结束后失效

def f1():
    def f2():
        print('from f2')
    f2()

f1() 

1.4 加载顺序

三种名称空间的执行顺序: 内置 --> 全局 --> 局部

1.5 查找顺序

三种名称空间的查找顺序: 首先从自己当前位置开始 --> 局部 --> 全局 --> 内置

二、作用域

域指的是区域,作用域即作用的区域

2.1 全局作用域

全局作用域: 全局+内置名称空间中的变量,全局作用域中的变量只能在全局中使用

2.2 局部作用域

局部作用域: 局部名称空间中的变量,局部作用域中的变量只能在局部中使用

2.3 注意

需要注意的是:作用域关系在函数定义阶段就固定死了,与函数的调用无关。

作用域关系仅适用不可变数据类型不适用于可变数据类型

x = 1

def f1():
    return x
    print(x)  # f1中的局部

def f2():
    x = 2  # x=2只能在f2中使用
    f1()

f2()  # f1中的局部和f2中的局部互不干涉

三、补充知识点

仅作了解,不推荐使用,如果非要跨作用域访问,可以使用可变类型

3.1 global关键字

修改全局作用域中的变量。

x = 1
def f1():
    global x  # 声明x为全局的x
    x = 3
f1()
print(x)

3

3.2 nonlocal关键字

修改局部作用域中的变量。针对嵌套函数局部之间的修改

def f1():
    x = 1
    def f2():
        nonlocal x  # 针对嵌套函数局部之间的修改
        x = 3
    f2()
    print(x)
f1()

3

原文地址:https://www.cnblogs.com/XuChengNotes/p/11329287.html