Python 命名空间是什么?
在学习 Python 编程语言过程中,我们经常会听到“命名空间”的概念。那么什么是 Python 命名空间呢?
阅读更多:Python 教程
什么是命名空间?
简单来说,命名空间就是变量名和函数名的存储空间。在 Python 中,每个变量和函数都必须被赋予名字,而这个名字被储存在特定的命名空间中。命名空间可以看作是一个映射,将每个名字映射到相应的对象。
Python 命名空间
Python 中有四种不同的命名空间:local
、global
、enclosed
和 built-in
命名空间。
1. Local 命名空间
在函数内部使用的变量和函数名位于 local 命名空间中。这个命名空间只有在函数被调用时才会创建,并且在函数执行结束时销毁。
def example_func():
x = 1
print(x)
example_func()
上面的代码中 x
就是在 example_func
函数内部定义的,在函数执行时创建了 local 命名空间,将 x
加入其中。当函数执行结束时, local 命名空间也被销毁,x
的值也随之消失。
2. Global 命名空间
定义在模块级别的变量和函数名位于 global 命名空间中。这个命名空间在 Python 解释器启动时创建,并且一直存活到解释器关闭。
x = 1
def example_func():
print(x)
example_func()
上面的代码定义了一个全局变量 x
,位于 global 命名空间中。当 example_func
被调用时,x
能在函数内部访问,因为在函数内部可以找到 global 命名空间中该变量的值。
3. Enclosing 命名空间
在内部函数中定义的变量和函数名位于 enclosing 命名空间中。如果内部函数是动态地定义,那么 enclosing 命名空间不会一直存在,只有当这个内部函数被引用的时候才会创建。
def example_func():
x = 1
def inner_func():
print(x)
inner_func()
example_func()
上面的代码中,inner_func
就是定义在 example_func
中的内部函数。x
位于 enclosing 命名空间中,因此 inner_func
可以在内部访问到该变量的值。
4. Built-in 命名空间
这是 Python 解释器默认提供的命名空间,其中包含了常见的变量和函数,例如 int
、float
、range
等。
命名空间搜索顺序
当我们在 Python 代码中引用变量或函数名时,解释器会按照一定的顺序搜索四种不同的命名空间,直到找到对应的名字,或者发现该名字不存在。
Python 中的命名空间搜索顺序如下:
- local 命名空间
- enclosing 命名空间(如果有)
- global 命名空间
- built-in 命名空间
如果在任何一个命名空间中都找不到该变量或函数名,那么解释器就会引发 NameError
异常。
一个示例
下面的代码演示了 Python 的命名空间搜索过程:
x = 1
def example_func():
x = 2
def inner_func():
x = 3
print(x)
inner_func()
print(x)
example_func()
print(x)
输出结果为:
3
2
1
首先,我们在 global 命名空间中定义了一个变量 x
,其值为 1
。在调用 example_func
函数时,创建了 local 命名空间,并将 x
值设为 2
。在调用 inner_func
函数时,创建了 enclosing 命名空间,并将 x
值设为 3
。所以在 inner_func
中打印出来的值为 3
。在离开 inner_func
后,控制权回到 example_func
函数,并在 local 命名空间中找到 x
的值为 2
。因此第二个打印结果为 2
。最后在 global 命名空间中找到 x
的值为 1
,因此第三个打印结果为 1
。
结论
Python 命名空间是变量名和函数名的存储空间。在 Python 中有四种不同的命名空间,分别是 local、global、enclosing 和 built-in 命名空间。在 Python 中,当我们在代码中引用变量或函数名时,解释器会按照一定的顺序搜索四种不同的命名空间,直到找到对应的名字,或者发现该名字不存在。了解命名空间的概念及其搜索原理对于理解 Python 语言非常重要。