点集拓扑的起源

把距离慢慢放下,从度量空间走向拓扑空间

距离明明很好用,为什么还要把它拿掉?从实数与自然数出发,看开集怎样接过距离的工作,三条拓扑公理又是怎样一步步长出来的。
作者

zhaoch

发布于

2026年10月10日

修改于

2026年10月10日

学拓扑时,我很容易在一个地方卡住。

前面还好好的:两点之间有距离,距离小就是靠得近,越来越近就可以谈收敛。这些事情多少都有一点生活经验撑着。

翻过几页,书上忽然说:给定一个集合,再指定一族子集,满足三条公理,就叫拓扑空间。

读到这里,我会忍不住往回翻。距离呢?图形呢?怎么只剩一堆集合了?这三条规矩又是从哪里冒出来的?

后来整理笔记,我觉得可以把中间被省略的那段路补回来。我们先拿着一把尺子,在熟悉的实数轴上走一走,看看它究竟帮我们做了哪些事。等这些事情看清楚,拓扑空间的定义就会有来处了。

这里说的“起源”,主要是一条理解概念的路线。真实的历史还汇集了点集、函数与极限等多条线索,我们在文末再回头看一眼。

尺子还在的时候

先看实数轴。

两个实数 \(x,y\) 之间的距离,我们再熟悉不过:

\[ d(x,y)=|x-y|. \]

\(2\) 和 \(3\) 相距 \(1\),\(2\) 和 \(2.001\) 相距 \(0.001\)。有了距离,“靠近”就有了可以计算的意思。

比如这个数列:

\[ 1,\quad \frac12,\quad \frac13,\quad \frac14,\quad \ldots \]

我们说它收敛到 \(0\)。把这句话拆开,就是:无论你在 \(0\) 周围圈出多小的一段范围,只要半径仍然大于零,数列走到足够后面,就会全部待在里面。

你圈 \((-0.1,0.1)\),从第 \(11\) 项起都在里面。你圈 \((-0.001,0.001)\),从第 \(1001\) 项起也都在里面。范围可以继续缩小,要等到第几项可以随之往后推。

这一小圈范围有个正式名字,叫开球:

\[ B_r(x)=\{y\in X:d(x,y)<r\},\qquad r>0. \tag{1}\]

在实数轴上,它就是开区间 \((x-r,x+r)\)。到了平面里,配上通常的欧氏距离,它是圆盘内部;到了三维空间,它才长得像我们日常说的球。数学里沿用“球”这个名字,是为了用同一句话处理这些情形。

度量空间(metric space)做的,就是把这把尺子推广到更一般的集合上。距离要非负,不同点之间的距离要大于零,要对称,还要满足三角不等式:绕道走,不能比直接走更短。1

至于集合里的“点”到底是一个数、一个向量,还是一整个函数,可以先不限制。只要这把尺子符合规则,我们就能画开球,继续讨论靠近与收敛。

开集:给每个点留一点余地

现在看区间 \((0,1)\)。

假如你站在 \(0.5\),左右都有不少空间可以活动。站到 \(0.99\),右边的余地已经很小,但仍然可以圈出一个足够小的开区间,把自己包在里面,而且整个区间都留在 \((0,1)\) 中。

只要你选的点还属于 \((0,1)\),这件事总能办到。每个点能用的半径可以不同;越靠近端点,半径往往就要越小。

这就是度量空间里“开集”的定义:对于集合 \(U\) 中的每一个点 \(x\),都能找到某个 \(r>0\),使得

\[ B_r(x)\subseteq U. \tag{2}\]

我们可以先把它读成一句话:站在集合里的任何一个点,都能给它圈出一小块完全属于这个集合的范围。

再试试 \([0,1]\)。在实数轴上,点 \(0\) 就会出问题。不管半径多小,以 \(0\) 为中心的开球都会包含负数,跑到 \([0,1]\) 外面去。所以 \([0,1]\) 不是实数轴上的开集。

到这里,“开”似乎很像“没有带上端点”。不过,这个印象马上就要接受一次小小的挑战。

把我们的整个空间换成自然数集 \(\mathbb N=\{1,2,3,\ldots\}\),距离仍然用 \(|m-n|\)。

现在站在 \(3\),圈一个半径为 \(0.4\) 的开球。按照 式 1 的定义,我们只从当前空间里挑点。\(2.8\)、\(3.1\) 都不在 \(\mathbb N\) 里,当然不能挑进来。结果是:

\[ B_{0.4}(3)=\{3\}\qquad\text{(在自然数空间中)}. \]

于是,单点集 \(\{3\}\) 在自然数空间里就是开集。它唯一的那个点,已经有一个完全待在集合里的开球了。

图 1: 同样以 3 为中心、取 0.4 的半径:在实数空间中,开球包含区间 (2.6,3.4) 的所有实数;在自然数空间中,开球只有自然数 3。

这个例子值得停一停。在实数轴上,\(\{3\}\) 不是开集;在自然数空间里,它却是。所谓“周围留有余地”,也不要求球里一定有别的点。

判断一个集合是不是开集,要连同它所在的空间一起看。 以后遇到“相对开”“子空间”这些词,可以先想起这幅图:整个世界变了,开球能挑到的点也跟着变了。

换一把尺子,有些事情照常发生

开集目前还是从距离算出来的。那它究竟依赖多少距离信息?

做一个很简单的实验。在同一条实数轴上,把距离改成

\[ d_1(x,y)=|x-y|,\qquad d_2(x,y)=100|x-y|. \]

每一段距离的读数都变了。原来相距 \(1\) 的两点,现在相距 \(100\)。

但用第二把尺子画一个半径为 \(r\) 的球,正好等于用第一把尺子画一个半径为 \(r/100\) 的球。半径换个数值,圈出的范围完全一样。因此,这两把尺子得到的开集也完全一样。

刚才的 \(1/n\) 仍然收敛到 \(0\)。一个函数会不会连续,也不该因为尺子的读数乘了 \(100\) 就改变。

这时,一个念头开始变得具体:距离告诉了我们很多事,其中有些事只取决于它产生的开集。把同一份开集结构留下来,也许就已经足够继续研究这些问题了。

当然,只把尺子放大 \(100\) 倍,还算不上多大的惊喜。我们还要看看,那些熟悉的概念能不能真的接过来。

收敛和连续,开始用开集说话

先回到 \(1/n\to0\)。

之前我们围着 \(0\) 画开球。现在改成选一个包含 \(0\) 的开集 \(U\)。由于 \(U\) 是开集,它一定容得下一个以 \(0\) 为中心的小开球。数列最终会待在那个小球里,自然也就最终待在 \(U\) 里。

反过来,开球本身也是开集。因此,只要数列最终待在每一个包含 \(0\) 的开集中,它当然也会最终待在每一个以 \(0\) 为中心的开球里。

这样,我们就把收敛完整地换了一种说法:

\(x_n\) 收敛到 \(x\),就是对每一个包含 \(x\) 的开集,从某一项起,后面的所有项都属于这个开集。

这句话里,距离函数已经不见了。在度量空间中,它与原来的距离定义等价;到了更一般的拓扑空间,我们仍然可以沿用这句话定义序列收敛。2

再看连续。

学微积分时,我们用 \(\varepsilon\) 和 \(\delta\) 表达:给定任意小的输出误差范围,总能找到一个足够小的输入误差范围,使输出满足要求。

用开集来讲,就是先在输出空间里,给 \(f(x)\) 指定一个开集作为允许活动的范围;如果函数在 \(x\) 连续,就能在输入空间里,找到一个包含 \(x\) 的开集,让其中所有点的输出都落在那个允许范围内。

把所有点的要求合在一起,就得到拓扑学里非常重要的一句话:

\[ \begin{gathered} f:X\longrightarrow Y\text{ 连续}\\ \Updownarrow\\ \text{每个开集的原像仍是开集}. \end{gathered} \tag{3}\]

“原像”初看有点绕。它只是问:输入里的哪些点,会被 \(f\) 送进指定的输出范围?把这些点收集起来,就是 \(f^{-1}(V)\),这里不要求 \(f\) 有反函数。

例如 \(f(x)=x^2\)。输出范围取 \(V=(1,4)\),能被送进去的输入恰好是

\[ f^{-1}((1,4))=(-2,-1)\cup(1,2), \]

它确实是开集。这一次检查只是一个例子;要证明连续,必须对每一个开集都成立。

展开看:连续为什么对应“开集的原像是开集”?

在度量空间中,假设 \(f\) 处处连续。取输出空间的开集 \(V\),再取任意 \(x\in f^{-1}(V)\)。因为 \(V\) 开,\(f(x)\) 周围有个小球完全待在 \(V\) 里;因为 \(f\) 在 \(x\) 连续,\(x\) 周围也有个小球,所有点的输出都进入前一个球。因此,后一个小球完全包含在 \(f^{-1}(V)\) 中。这对原像里的每个点都成立,所以原像开。

反过来,假设每个开集的原像都开。给定 \(x\) 和输出半径 \(\varepsilon>0\),把输出开集选为 \(B_\varepsilon(f(x))\)。它的原像开,并且包含 \(x\),所以包含某个输入开球 \(B_\delta(x)\)。这正好给出 \(\varepsilon\)–\(\delta\) 连续性所需的 \(\delta\)。

到这里,我们已经看见两件很实在的事情:收敛可以用开集表达,连续也可以用开集表达。那一族开集,确实接住了距离原来承担的一部分工作。

三条公理,是怎样长出来的

既然准备留下开集,就得弄清楚:度量产生的开集,总有哪些共同规律?

先看最简单的两个集合。整个空间 \(X\) 是开的,因为任何开球都在这个空间里。空集 \(\varnothing\) 也是开的:它没有任何点需要检查,自然不会出现一个不满足条件的点。

接下来,把一批开集并起来。

一个点只要属于这个并集,就至少属于其中某一个开集。那个开集已经给它准备好了一个小球,小球当然也待在更大的并集里。

所以,任意多个开集的并,仍然是开集。 这里用不上“总共有多少个集合”,有限、可数无限,甚至不可数,都可以。

再把两个开集交起来。

假如 \(x\) 同时属于 \(U\) 和 \(V\),\(U\) 给它一个半径 \(r_U>0\),\(V\) 给它一个半径 \(r_V>0\)。我们取较小的那个:

\[ r=\min\{r_U,r_V\}>0. \]

用这个半径画出的球,就同时待在 \(U\) 和 \(V\) 中,也就待在交集里。三个、四个,乃至任意有限多个开集,都能这样取最小半径。

所以,有限多个开集的交,仍然是开集。

这里为什么忽然要强调“有限”?我们试着把范围一层层缩下去:

\[ (-1,1),\quad \left(-\frac12,\frac12\right),\quad \left(-\frac13,\frac13\right),\quad\ldots \]

每次只取有限层的交,总还剩一个有正半径的开区间。可如果要求同时属于所有这些区间,任何非零实数迟早都会被排除,最后只剩

\[ \bigcap_{n=1}^{\infty}\left(-\frac1n,\frac1n\right)=\{0\}. \tag{4}\]

\(\{0\}\) 在实数轴上不是开集。那些正半径可以无限趋近于零,给交集留下的余地就消失了。

“有限交”这三个字,到这里就有了分量。三条公理中的这个限制,是我们亲手试出来的。

现在,可以把距离放下了

我们终于走到了书上那个定义的门口。

给定一个集合 \(X\),选出它的一族子集 \(\tau\)。这个 \(\tau\) 是一份“哪些子集算开集”的名单。只要名单满足:

  1. \(\varnothing\) 和 \(X\) 都在 \(\tau\) 中;
  2. \(\tau\) 中任意一族集合的并,仍在 \(\tau\) 中;
  3. \(\tau\) 中有限多个集合的交,仍在 \(\tau\) 中,

就称 \(\tau\) 是 \(X\) 上的一个拓扑(topology),称 \((X,\tau)\) 是一个拓扑空间(topological space)。名单中的成员,叫作这个空间的开集。

这个定义省掉了一项要求:我们不必先提供一个距离,再由距离生成开集。可以直接提供开集名单,只要遵守这三条规则。

因此,原来的度量空间有一个自然的位置。每个距离 \(d\) 都能生成一族开集 \(\tau_d\),也就得到一个拓扑空间:

\[ (X,d)\quad\longmapsto\quad(X,\tau_d). \tag{5}\]

这就是笔记里“度量空间是拓扑空间的特例”那句话的具体意思:每个度量空间都自然给出一个拓扑空间;拓扑空间则允许更多的开集结构。

而且,更多确实是更多。

取只有两个点的集合 \(X=\{a,b\}\),规定它的开集只有空集和全集:

\[ \tau=\{\varnothing,X\}. \]

你可以逐条检查,它满足三条公理,所以是一个合法的拓扑空间。这个拓扑叫平凡拓扑(indiscrete topology)。

可是,没有任何距离能在这两个点上生成这份名单。因为如果真的有距离,\(d(a,b)\) 必须是某个正数 \(s\)。以 \(a\) 为中心、半径取 \(s/2\),开球就只剩 \(\{a\}\);它一定是度量生成的开集,却没有出现在我们的名单里。矛盾了。

这扇门确实打开了。拓扑空间中,有些还能找到一把与其开集结构相配的尺子,有些则找不到。开集公理已经允许我们一起研究它们。这一层的理论,就是点集拓扑(point-set topology),也叫一般拓扑(general topology)。

尺子放下以后,也要知道少了什么

走到这里,很容易生出一种兴奋:原来不用距离,也能谈这么多事情。

但抽象有代价。只保留开集,我们就无法再从中读出两点相距几米,也无法据此比较两条曲线的长度。我们保留了连续、收敛这些概念需要的结构,舍去了更多数值信息。

前些天讨论的柯西序列,恰好提醒了我这一点。

“收敛到 \(x\)”可以围着一个已经指定的点 \(x\),检查所有开邻域。“柯西”则要比较数列后面的项彼此有多近,要求它们最终一起满足任意给定的距离精度。单凭一般拓扑的开集名单,这种统一的精度比较并没有被提供。通常我们在度量空间中谈柯西序列;要进一步推广,就需要一致结构等额外信息。

甚至在同一个集合上,两把尺子可以给出完全一样的开集,却对“是否完备”给出不同答案。

一个可以慢慢看的例子:同样的开集,不同的完备性

在 \(\mathbb R\) 上,考虑通常距离 \(d(x,y)=|x-y|\),以及另一个距离

\[ \rho(x,y)=|\arctan x-\arctan y|. \]

函数 \(\arctan\) 把整个实数轴连续、可逆地对应到开区间 \((-\pi/2,\pi/2)\);其反函数 \(\tan\) 也连续。因此,\(d\) 与 \(\rho\) 生成的开集相同。

但数列 \(x_n=n\) 在 \(\rho\) 下是柯西序列,因为 \(\arctan n\) 越来越靠近 \(\pi/2\)。它却不能在 \(\mathbb R\) 中按 \(\rho\) 收敛:没有任何有限实数 \(x\) 满足 \(\arctan x=\pi/2\)。

所以通常距离下的 \(\mathbb R\) 完备,这个新距离下的 \(\mathbb R\) 不完备。开集结构相同,并没有让两把尺子的柯西判断也相同。

这也让“抽象”变得更清楚了。我们需要一边看清留下来的东西,一边记住已经舍去的东西。以后研究紧致性、连通性,可以继续沿开集这条线走;研究完备性,就要把所用的距离或相应的额外结构说清楚。

再读一次那个定义

现在回头看开头那三条公理,我的感觉会不一样。

第一次看到时,它们像是突然摆在桌上的规定。再走一遍这条路,就能想起它们背后的画面:一个点周围的小球,并集里收留它的某个开集,有限交时还能取到的最小半径,以及无限缩小时最后消失的余地。

整理学习笔记时,我留下过这样一句话:

把度量空间中由距离诱导出来的开集结构抽象出来,以开集公理定义拓扑空间,从而不依赖具体距离来研究空间的拓扑性质。

这句话现在终于有了一点温度。它里面的每一步,我们都在实数轴上试过,也在自然数里检查过。

抽象后的定理能够回到具体例子中使用,道理也在这里:具体例子符合公理,也符合定理的其他前提,所以证明中每一步都适用于它。少了某个前提,就得重新检查,不能因为名字里都带着“空间”,便把结论直接搬过去。

我喜欢这样理解数学中的一次抽象:从熟悉的地方出发,带着一个问题往前走,渐渐发现有些原以为离不开的东西,原来可以先放下。

尺子放到一旁以后,那个空间依然有可以研究的结构。我们还知道怎样围住一个点,怎样表达趋近,怎样让一个映射保持连续。书页上那一族抽象的集合,也终于和眼前的实数轴接上了。

顺着这条线,回望一点历史

这篇文章重走的是一条概念路线。真实历史中,人们对点集、极限和函数的研究逐渐交织,形成了更一般的空间观念。

Fréchet 在 1906 年的论文 Sur quelques points du calcul fonctionnel 中,已经尝试把不同对象上的极限与连续性放进统一的抽象研究中。他在开篇讨论的困难很具体:对象可以是点,也可以是曲线等;如果每换一类对象就重新制定一套极限理论,很难看到共同的规律。[1]

Hausdorff 的 1914 年著作 Grundzüge der Mengenlehre 则是拓扑空间理论发展的重要里程碑。它采用邻域公理的表述;今天教材中常见的开集定义,是这段发展在现代语言中的呈现,不能直接当作当年原文的逐字复述。3

我们正在读的 Bredon Topology and Geometry(GTM 139),第一章便是一般拓扑。[2] 读这些书时,我想把这条线索留在旁边:遇到一个抽象定义,先找找它在熟悉的例子中,究竟留下了什么。

参考与延伸阅读

[1]
M. Fréchet, 《Sur quelques points du calcul fonctionnel》, Rendiconti del Circolo Matematico di Palermo, 卷 22, 页 1~72, 1906, doi: 10.1007/BF03018603.
[2]
G. E. Bredon, Topology and Geometry, 卷 139. 收入 Graduate Texts in Mathematics, vol. 139. Springer, 1993. doi: 10.1007/978-1-4757-6848-0.

修订记录

2026-10-10:根据拓扑与公理化学习笔记写成首稿,补充自然数与实数的开球对照、开集公理的由来,以及柯西序列与完备性的边界。

脚注

  1. 完整地写,度量 \(d:X\times X\to[0,\infty)\) 满足 \(d(x,y)=0\iff x=y\)、\(d(x,y)=d(y,x)\)、\(d(x,z)\le d(x,y)+d(y,z)\)。本文所有半径都取正数。开集与连续性的标准度量空间定义,也可对照 MIT《Analysis II》第一讲。↩︎

  2. 在一般拓扑空间中,序列仍然可以收敛,但只靠序列的收敛情况,未必足以判断哪些集合是开集,或一个映射是否连续。本文只把收敛的定义接过来,不把度量空间中所有关于序列的结论一并推广。↩︎

  3. 原书年代与版本信息见波恩大学 Hausdorff 全集项目;关于原书邻域公理及其与现代定义的关系,见该项目的《Zum Begriff des topologischen Raumes》研究文章。↩︎