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 语言非常重要。
极客笔记