问题的历史
命名空间(Namespaces)是 Python 的基本概念之一,自语言的早期版本以来就存在。它旨在系统化名称,以避免程序不同部分之间的变量、函数和类冲突。
问题
在大型项目中,会出现大量的函数、类、变量和模块。如果不正确使用命名空间,可能会覆盖重要名称,导致意外的变量遮蔽,以及在测试和扩展时遇到困难。
解决方案
在 Python 中,命名空间是将名称与对象关联的映射(mapping)。存在不同级别的命名空间:局部、全局、模块空间和类空间。理解这种划分确保正确访问所需的对象,并最小化冲突。
代码示例:
def foo(): x = 10 # x 在函数的局部命名空间中 print(x) y = 20 # y 在模块的全局命名空间中 foo() print(y)
关键特性:
如果在同一个函数中声明一个与全局变量同名的局部变量,会发生什么?
局部变量将在函数执行期间“遮蔽”全局变量;在函数外,全局变量将保持不变。
a = 1 def test(): a = 2 print(a) # 2 test() print(a) # 1
如何获取当前命名空间中所有名称的列表?
函数 locals()、globals()、dir() 返回当前作用域/命名空间中的相应映射或名称列表。
类命名空间和实例命名空间有什么区别?
类命名空间定义类中所有实例共享的属性。实例命名空间则是特定对象的属性。实例中的更改不会影响类,反之亦然。
在整个大型项目中使用了 from mymodule import *。结果是函数名称被覆盖,由于包之间名称冲突,出现了难以捕捉的错误。
优点:
缺点:
转向使用导入别名(import mymodule as mm),明确结构化模块。
优点:
缺点: