命名空间
命名空间是映射到对象的名称。使用python字典实现的;是为了避免名称冲突的一种方法。各个命名空间是独立的,没有任何关系,即在一个命名空间中不能有重复的名称,但是在不同命名空间中可以重复,而不会影响其它命名空间;
命名空间分类
总共有三种类别的命名空间:
- 内置命名空间:主要用于存放内置函数;如: abs();
- 全局命名空间:主要记录了模块的变量,包括函数、类、其它导入模块、模块级的变量和常量;
- 局部命名空间:函数中定义的名称;主要记录了函数的变量,包括函数的参数和局部定义的变量;类中也是;
查找顺序
局部命名空间 > 全局命名空间 > 内置命名空间
生命周期
命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期结束;
- 内置命名空间:解释四起启动时创建,退出时销毁
- 全局命名空间:解释器读取模块定义时创建,一直持续到解释器退出
- 局部命名空间:调用函数时创建,并在函数返回或抛出异常时被删除
作用域
决定命名空间可直接访问python程序的文本区域,可直接访问是对名称的非限定引用会在命名空间中进行查找;作用域虽然是静态的,但会动态使用;在python中,只有模块、类、函数才会引入新的作用域;其他代码块,不会引入新的作用域;
作用域分类:
- 局部作用域(Local):最内层作用域,包含局部变量;如:函数内部定义的一些变量
- 嵌套作用域(Enclosing):包含非局部名称和非全局名称;如两个嵌套函数;
- 全局作用域(Global):当前模块的全局名称
- 内建作用域(BuiltIn):内置名称的命名空间
查找顺序
局部作用域(L) > 嵌套作用域(E) > 全局作用域(G) > 内建作用域(B)
global和nonlocal
python有一个特殊规定;如果不存在global和nonlocal语句,则对变量的赋值总是进入局部作用域中,赋值操作不会复制数据,只是将变量名称绑定到对象。删除也是如此:del x从局部作用域引用的命名空间中移除对于x的绑定。所有引用新名称的操作都是使用局部作用域;尤其import语句和函数定义会在局部作用域中绑定模块或函数名称。
global
应用于代码块,用来在函数或其他局部作用域中将变量应用于全局变量,实现在函数内部或其他局部作用域中改变变量的值;所有对该名称的使用都是在全局命名空间内对该名称的绑定引用;其命名空间包含该代码所在模块的命名空间,以及内置命名空间;全局命名空间先被搜索;如果未找到指定名称,再搜索内置命名空间;
如果在局部作用域中不使用global关键字,则在函数内部修改的变量不会影响到全局变量:
g = 'test'
def do_local():
g = 'local'
print('do_local inside: ', g)
do_local()
print('global: ', g)
# do_local inside: local
# global: test
global仅如果局部要对全局变量进行修改:
g = 'test'
def outer():
g = 'nonlocal'
def do_local():
global g
g = 'global'
print('do_local inside: ', g)
do_local()
print('outer: ', g)
outer()
print('global: ', g)
# do_local inside: global
# outer: nonlocal
# global: global
nonlocal
仅用于修改嵌套作用域中的变量
def outer():
n = 'test'
def do_local():
nonlocal n
n = 'nonlocal'
do_local()
print('outer: ', n)
outer()
# outer: nonlocal
本文详细介绍了Python中的命名空间概念,包括内置、全局和局部命名空间的定义与作用,以及它们的生命周期、查找顺序等关键信息。同时,还深入探讨了`global`和`nonlocal`关键字如何帮助修改不同作用域内的变量。
1784

被折叠的 条评论
为什么被折叠?



