公众号旧文

从文件到编程,看懂 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

发现整个操作系统都可以被划分空间。

最终会发现,计算机世界大量复杂系统,都在重复同一个设计:

给名字划定范围,让名字能够安全、有序地指向资源。

目录不是简单的文件整理工具。

它是人类最早接触到的一种命名空间设计。

而命名空间,是计算机管理复杂世界的一种基本方法。