公众号旧文
从文件到编程,看懂 namespace 的统一思想
今天在学习 python 时,见到了一个名词:变量表(namespace)
我寻思,这不就是命名空间吗?
那什么叫命名空间?
简单来说:
命名空间就是给名字提供一个管理范围,让同一个名字可以在不同范围内代表不同的东西。
而实际上,我们每天都在使用命名空间。
比如:
- 电脑里的文件夹
- Python 的变量环境
- Java 的 package
- C++ 的 namespace
- Linux 的 namespace
- DNS 域名系统
它们看起来属于完全不同的领域,但背后是同一个思想:
名字只是一个索引,真正重要的是这个名字在哪个空间里被解释。
一、文件目录:最早接触的命名空间
我们先看最直观的例子:电脑文件系统。
假设有两个文件:
/home/tom/test.txt
/home/jerry/test.txt
注意:
两个文件都叫 test.txt
如果整个电脑只有一个名字空间,那么系统会混乱。
但是有了目录:
/home/tom/ 和 /home/jerry/
以后:
/home/tom/test.txt
和:
/home/jerry/test.txt
就是两个不同的名字。
目录实际上提供了一层命名空间。
可以理解为:
tom目录空间
test.txt
|
↓
文件A
jerry目录空间
test.txt
|
↓
文件B
同样的名字,因为处于不同空间,所以没有冲突。
二、Python变量:变量表也是命名空间
再看 Python。
代码:
age = 22
很多人会理解为:创建一个变量盒子 age,里面放 22
但 Python 更接近:
名字 对象
age ------> 22
Python 内部维护一个名字表。
例如:
globals()
可能看到:
{
'age': 22
}

这里:
age
不是数据,而只是一个名字。
真正的数据:
22
在对象里面。
如果两个函数都有同名变量:
def a():
name = "Tom"
def b():
name = "Jerry"
为什么不会冲突?
因为:
函数a命名空间
name ---> Tom
函数b命名空间
name ---> Jerry
两个 name 属于不同空间。
三、Python模块:文件也是命名空间
Python:
import os
为什么不会和你的变量冲突?
因为模块提供了新的命名空间。
例如 os 模块:
os空间
path ---> 路径处理函数
listdir ---> 文件列表函数
你的程序:
自己的空间
path ---> 你的变量
两个 path 不冲突。
调用时:
os.path
意思是:进入 os 这个命名空间,寻找 path。
类似:目录/path
四、DNS:互联网也是一个巨大的命名空间
DNS 可能是最广泛使用的命名空间。
例如:
www.baidu.com
实际上:
.
|
com
|
baidu
|
www
它是一棵树。
根:
.
下面:
com
net
org
再下面:
baidu
google
最终:
www
五、Linux namespace:把整个系统隔离
Linux 里面也有 namespace。
例如 Docker。
一个服务器:
真实系统
进程A
进程B
网络
文件系统
启动 Docker:
容器1
自己的进程空间
自己的网络空间
自己的文件视图
容器2
自己的进程空间
自己的网络空间
自己的文件视图
容器里的:
PID 1
和宿主机:
PID 1
不是同一个。
因为它们属于不同 namespace。
六、所有命名空间背后的共同模型
虽然领域不同,但本质都是:
名字
↓
在某个空间中查找
↓
找到对应资源
七、为什么计算机世界如此依赖命名空间?
因为现实系统太复杂。
所以计算机设计了各种隔离机制:
| 领域 | 命名空间 |
|---|---|
| 文件系统 | 目录 |
| Python | namespace / scope |
| Java | package |
| C++ | namespace |
| 互联网 | DNS |
| 容器 | Linux namespace |
| 数据库 | schema |
八、从目录开始理解整个计算机世界
我们小时候使用电脑时,就已经接触过命名空间:
文件夹
只是当时不知道它的名字。
现在学习 Python:
变量表
发现变量也需要空间管理。
学习网络:
DNS
发现域名也是空间管理。
学习 Docker:
Linux namespace
发现整个操作系统都可以被划分空间。
最终会发现,计算机世界大量复杂系统,都在重复同一个设计:
给名字划定范围,让名字能够安全、有序地指向资源。
目录不是简单的文件整理工具。
它是人类最早接触到的一种命名空间设计。
而命名空间,是计算机管理复杂世界的一种基本方法。