简单来说,命名空间是名称的集合。
在 Python 中,我们可以将命名空间想象为我们将定义的每个名称与对应对象之间的映射。
它用于存储程序中变量和其他对象的值,并将它们与特定名称关联起来。
这允许我们在代码的不同部分对不同的变量或对象使用相同的名称,而不会引起任何冲突或混淆。
Python 命名空间的类型
当我们启动 Python 解释器时,会创建一个包含所有内置名称的命名空间,并一直存在,直到解释器运行结束。
这就是为什么像 id()、print() 等内置函数始终可以在程序的任何部分使用。每个模块都会创建自己的全局命名空间。
这些不同的命名空间是相互隔离的。因此,可能存在于不同模块中的同名变量不会发生冲突。
模块可以有各种函数和类。当调用函数时,会创建一个局部命名空间,其中包含函数中定义的所有名称。
类的情况也是如此。下图可能有助于阐明此概念。

Python 变量作用域
尽管定义了各种唯一的命名空间,但我们可能无法从程序的每个部分访问所有这些命名空间。作用域的概念就发挥作用了。
作用域是程序中可以直接访问命名空间而无需任何前缀的部分。
在任何给定时刻,至少有三个嵌套作用域。
- 包含局部名称的当前函数作用域
- 包含全局名称的模块作用域
- 包含内置名称的最外层作用域
当在函数内部进行引用时,名称首先在局部命名空间中查找,然后在全局命名空间中查找,最后在内置命名空间中查找。
如果一个函数内部有另一个函数,则会在局部作用域内部嵌套一个新的作用域。
示例 1:Python 中的作用域和命名空间
# global_var is in the global namespace
global_var = 10
def outer_function():
# outer_var is in the local namespace
outer_var = 20
def inner_function():
# inner_var is in the nested local namespace
inner_var = 30
print(inner_var)
print(outer_var)
inner_function()
# print the value of the global variable
print(global_var)
# call the outer function and print local and nested local variables
outer_function()
输出
10 20 30
在上面的示例中,有三个独立的命名空间:全局命名空间、外部函数内的局部命名空间以及内部函数内的局部命名空间。
这里,
- global_var - 位于全局命名空间中,值为 10
- outer_val - 位于
outer_function()
的局部命名空间中,值为 20 - inner_val - 位于
inner_function()
的嵌套局部命名空间中,值为 30
当执行代码时,首先打印 global_var 全局变量,然后当调用外部函数和内部函数时,打印局部变量 outer_var 和 inner_var。
示例 2:Python 中 global 关键字的使用
# define global variable
global_var = 10
def my_function():
# define local variable
local_var = 20
# modify global variable value
global global_var
global_var = 30
# print global variable value
print(global_var)
# call the function and modify the global variable
my_function()
# print the modified value of the global variable
print(global_var)
输出
10 30
在这里,当调用函数时,使用global 关键字来指示 global_var 是一个全局变量,并且其值被修改为 30。
因此,当执行代码时,首先打印值为 10 的 global_var,然后调用函数,并从函数内部将全局变量修改为 30。
最后再次打印修改后的 global_var 的值。
另请阅读