Python中每个对象都存储在一个命名空间(namespace)中,命名空间相当于是一个名字到对象的映射。理解命名空间对于理解Python的作用域规则至关重要。
Python中命名空间可以分为三类:内置命名空间(built-in namespace)、全局命名空间(global namespace)和局部命名空间(local namespace)。
- 内置命名空间
内置命名空间是指Python解释器加载时自动加载的一些名字,并默认绑定到相应的对象上。这些名字在任何模块中都是可用的,无需导入便能使用,比如常见的print
、list
等。
以下是一个例子,可以通过dir(__builtins__)
来查看内置命名空间。
import builtins
print(dir(builtins)) # 可以直接使用内置函数dir(),查看内置命名空间中的内容
- 全局命名空间
全局命名空间是定义在模块层级的命名空间,模块中定义的所有变量和函数名都属于全局命名空间。在模块被导入时创建,当程序执行结束时被销毁。
以下是一个例子,global_var
是在全局命名空间中定义的变量。
global_var = 10
def func():
print(global_var)
func() # 输出10
- 局部命名空间
局部命名空间是在函数调用时创建的,函数调用结束后销毁。局部命名空间中的变量和函数名只在函数内部可见,在函数外部无法访问。
以下是一个例子,func
中定义了局部变量local_var
,只能在函数内部访问。
def func():
local_var = 20
print(local_var)
func() # 输出20
print(local_var) # NameError
总的来说,当Python解释器访问一个变量名时,它首先在内置命名空间中查找,如果没有找到则查找全局命名空间,如果还是没有找到则查找局部命名空间。如果变量还是没有找到,则会产生NameError
异常。
参考资料:
- https://docs.python.org/3/tutorial/classes.html#scopes-and-namespaces-example
- https://realpython.com/python-namespaces-scope/#the-three-types-of-namespace
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解python命名空间 - Python技术站