2.1.3 Python 的动态类型*

如果将计算机内存单元比喻成宾馆的房间,那么编程语言中的变量可以理解成这些房间的“门牌标识”。将一个数据存入变量,实际上是存入该变量所标识的内存单元;而访问一 个变量,当然就是访问该变量所标识的内存单元中的数据。

绝大多数编程语言中对变量的使用有严格的类型限制,一个变量固定作为某内存单元的 标识,并且该单元只能存储特定类型的数据。这就好比宾馆的房间分为客房、员工房和工作 间等,客房又分单人间、双人间和套房等,每个房间有固定的门牌号,不同人员只能进入规 定的房间。如果一个变量预先声明为只能存入数值数据,那就不能将字符串存进该变量;一 旦发生存入的数据与预先声明的类型不一致的情况,程序即出错。我们称这种编程语言是静 态类型化的。

然而,Python 语言采用的是另一种技术——动态类型化。在 Python 中,变量并不是某 个固定内存单元的标识,也就不需要预先定义变量的类型。事实上,Python 变量是对内存 中存储的某个数据的引用(reference),这个引用是可以动态改变的。变量的类型就是它所 引用的数据的类型,对变量的每一次赋值,都可能改变变量的类型。还是用宾馆的比喻,这 就好比宾馆房间没有固定的门牌号码,某个门牌号 N 今天可以挂在单人间门上,明天又可 以换到总统套房的门上。于是 N 今天是单人间类型,明天又是套房类型,总之类型是动态 确定的。

例如,执行下面的赋值后,Python 在内存中创建数据 123,并使变量 x 指向这个数据, 因此可以说 x 的类型现在是整数类型。

>>> x = 123
>>> print x
123

如果进而执行下面的赋值语句,则 Python 又在内存中创建数据"Hello",并使 x 改为指向 这个字符串数据,因此 x 的类型现在变成了字符串类型。参见图 2.2。

>>> x = "Hello"
>>> print x
Hello

图 2.2 变量的动态类型化

顺便说一下,当 x 从 123 转而指向"Hello"后,数据 123 就变成了无人使用的“垃圾 数据”(除非还有别的变量引用它),Python 会回收垃圾数据的存储单元,以便提供给别的 数据使用,这称为垃圾回收(garbage collection)。读者可以思考一下,如果没有垃圾回收,会造成什么后果?