Python 中的命名空间是一个字典 (dictionary),它在字典中保存了变量名和对应的对象的内存地址。Python 解释器用它来确定在任何作用域中的名称所指向的对象。在 Python 中有以下几种命名空间:
- 内置命名空间
- 全局命名空间
- 局部命名空间
这三种类型的命名空间以一种栈的形式来实现,在 Python 中被称为作用域(scope)。作用域定义了变量的可见范围和生命周期。
内置命名空间
内置命名空间包含了 Python 的内置函数和模块,这些模块在 Python 解释器启动时自动加载到内存中,不需要通过 import
导入即可使用。
例如,可以通过以下代码打印一些内置的类型和函数:
print(dir(__builtins__))
输出结果中包含了许多内置命名空间中的变量名和其对应的内存地址。
全局命名空间
全局命名空间包含了在全局范围内定义的变量、函数和类。在 Python 中,全局命名空间在模块被导入时创建,并在模块中定义的所有函数和类所在的命名空间中可见。
例如,在以下代码中,变量 num
和函数 func
都被定义在全局命名空间中:
num = 100
def func():
print("This is a function")
print(dir())
在 dir()
函数的输出结果中,可以看到 num
和 func
两个变量的名称。
局部命名空间
局部命名空间包含在函数内部定义的变量和参数。当函数被调用时,Python 解释器将创建一个新的局部命名空间,在其中存放函数参数和变量名。当函数返回时,局部命名空间中的对象将被销毁。
例如,在以下代码中,变量 x
和 y
都被定义在函数 add()
的局部命名空间中:
def add(x, y):
result = x + y
print(result)
print(dir())
add(3, 4)
在 add()
函数的执行过程中,dir()
函数输出了 result
、x
和 y
三个变量的名称。当函数执行结束后,这三个变量所在的局部命名空间将被销毁。
需要注意的是,在 Python 中,变量名的作用域是依赖于代码块的,而不是依赖于函数的。如果一个变量在某个代码块中被定义,那么它在该代码块以及该代码块嵌套的其他代码块中都可以被访问,其作用域的范围在代码块内。
例如,在以下代码中,变量 x
被定义在 if
语句块内,但可以在 else
语句块中访问:
if True:
x = 1
else:
print(x)
如果 if
语句条件不成立而执行了 else
语句,那么将会抛出一个 NameError
异常,因为 x
变量未被定义。因此,在使用变量之前,需要确保变量已经被定义。