命名空间是名字到对象的映射容器,作用是隔离同名标识符,避免不同模块/库之间的命名冲突,同时让代码的归属和依赖关系清晰可见。

Python 中命名空间体现在多个层次:内置命名空间(len 等)、模块全局命名空间、函数局部命名空间,查找遵循 LEGB 规则。import math 后用 math.sqrt,与自定义的 sqrt 互不干扰——这正是"命名空间是个绝妙的主意"(Zen of Python 最后一条)的含义。

如果没有命名空间机制,设计替代方案可以考虑:

  • 命名前缀约定:像 C 语言那样用 mymod_func 前缀,成本低但冗长、靠自觉。
  • 闭包/模块对象封装:JavaScript 早期的 IIFE 模块模式,把私有成员包在函数作用域内,只暴露导出对象。
  • 显式注册表:所有名字注册进中心字典,按类别分桶管理,本质上是用一个数据结构重新实现命名空间。

实践中大多数语言的最终答案都是某种形式的模块/包系统,说明按作用域隔离名字是刚需,区别只在语法层面是显式还是隐式。追问方向:Python 的 from x import * 为何危险、__all__ 的作用。