1. Python命名空间
在Python中,每个变量都有其所属的命名空间,命名空间其实就是保存变量名与对象之间对应关系的一个系统。Python最常见的命名空间有以下几种:
1.1 内置命名空间
内置命名空间是在Python解释器启动时就加载到内存中的,其中包含了一些内置函数和模块,这些在Python解释器中始终可用。
import builtins
print(dir(builtins))
dir() 函数可以列出内置命名空间中的所有变量名。
1.2 全局命名空间
全局命名空间是在Python模块被导入时创建的,它保存了当前模块中定义的所有函数和变量,只有在当前模块中才能直接访问这些函数和变量。
a = 1
def func():
print(a)
func()
在函数外定义的变量 a 属于全局命名空间,因此函数内部直接可以使用。
1.3 局部命名空间
局部命名空间是在函数被调用时创建的,它保存了函数中定义的所有函数和变量,只有在函数内部才能直接访问这些函数和变量。
def func():
b = 2
print(b)
func()
在函数内部定义的变量 b 属于局部命名空间,因此函数外部无法直接访问。
2. 命名空间和作用域
命名空间和作用域是Python中两个非常重要的概念。
2.1 作用域
作用域是Python中一个限定变量名访问范围的定义域。Python中有三种作用域:
全局作用域
局部作用域
内置作用域
作用域中变量名的访问遵循 L-E-G-B 规则,即:
尝试在当前作用域内查找变量名
尝试在上一级作用域内查找变量名,直到找到为止
如果在全局作用域和内置作用域仍然找不到,则抛出 NameError 异常
2.2 命名空间
命名空间是Python中一个保存变量名与对象之间对应关系的系统。基本上,命名空间就是储存变量名的容器。
在Python中,每个命名空间都有其自己的作用域。简单来说,作用域决定了哪些命名空间可以访问哪些变量名。
Python中的命名空间有四种不同的类型:
局部命名空间
全局命名空间
内置命名空间
对象命名空间
Python中的每个对象都有一个对象命名空间,用于存储特定对象的属性和方法。
3. 命名空间和作用域的应用
命名空间和作用域是Python中非常重要的概念,他们直接影响着代码的编写和调试。下面给出一些应用例子。
3.1 全局变量和局部变量
全局变量定义在模块级别,可以被模块内部的所有函数直接访问。而在函数内部定义的变量属于函数的局部变量,只有在函数内部可以被访问。
a = 1 # 全局变量
def func():
b = 2 # 局部变量
print(a + b)
func()
3.2 命名空间的增删改查
可以使用 Python 内置的 globals() 和 locals() 函数查看全局和局部命名空间中的变量名。
a = 1 # 全局变量
def func():
b = 2 # 局部变量
print(globals()) # 查看全局命名空间
print(locals()) # 查看局部命名空间
func()
由于内置命名空间无法直接访问,所以要查看内置命名空间中的变量名需要先导入 builtins 模块。
import builtins
print(dir(builtins)) # 查看内置命名空间
可以使用 del 关键字删除一个变量名。
a = 1 # 全局变量
def func():
del a
print(a)
func()
可以使用 setattr 函数将一个值赋值给一个命名空间中的变量名。
def func():
locals()['a'] = 1
print(a)
func()
可以使用 hasattr 函数检查一个命名空间中是否存在指定的变量名。
a = 1 # 全局变量
def func():
if hasattr(globals(), 'a'):
print('a exists in global namespace')
else:
print('a does not exist in global namespace')
func()
3.3 嵌套函数以及nonlocal关键字
在Python中可以在一个函数内定义另一个函数,这个称为嵌套函数。在嵌套函数中,内部函数可以访问外部函数的局部变量和参数。
def outer():
a = 1
def inner():
nonlocal a
a += 1
print(a)
inner()
outer()
如果要在内部函数中修改外部函数的局部变量,需要使用 nonlocal 关键字。
4. 总结
本文详细介绍了Python中的命名空间和作用域。命名空间是Python中保存变量名和对象之间对应关系的一种系统,Python中有多种不同类型的命名空间。作用域是Python中一个限定变量名访问范围的定义域,Python中有三种不同的作用域。这些概念可以帮助我们更好的理解Python中的变量名和函数调用。同时,本文还给出了一些实际应用的例子,如全局变量和局部变量、嵌套函数以及nonlocal关键字等。希望能够对大家更好的理解Python中的命名空间和作用域有所帮助。