缺少声明语句的情况——类型与对象共存,而非变量

未匹配的标注

要了解对象类型是如何发生的,看一下如果对一个变量赋值多次会发生什么:

>>> a = 3 # 它是个整数
>>> a = 'spam' # 现在是个字符串
>>> a = 1.23 # 现在是个浮点数

这不是典型的Python代码,但它确实可以运行——a开始作为整数,然后变成字符串,最后变成浮点数。对之前有C语言经验的程序员,这个例子往往看起来特别奇怪,因为当运行a='spam'时,好像a的类型从整数变成字符串。

然而,这不是真实发生的事情。在Python中,事情运行得简单得多。名称没有类型;如前所述,类型与对象共存,而非名称。在前面的代码列表中,简单地改变a来引用不同的对象。因为变量没有类型,所以没有真正的改变变量a的类型;只是简单地让变量引用不同类型的对象。事实上,再说一次,在Python中关于变量可以一直说的就是:它在某个特定时间点引用某个特定对象。

另一方面,对象知道它们是什么类型——每个对象包含了标记对象类型的头字段。比如,整数对象3将包含值3,加上告诉Python这个对象是整数的标记符(严格的说,是名为int的对象的指针,整数类型的名称)。而spam字符串的类型标记符指向字符串类型(名为str)。因为对象知道它们的类型,变量就不必知道了。

复习一下:在Python中,类型和对象联系在一起,而非变量。在典型的代码中,给定变量通常只引用一种类型的对象。然而,因为这不是一个必要条件,会发现Python代码往往比已经习惯的更灵活——如果Python用得好,代码可能会自动适用于许多类型。

这里提到了对象有两个头字段,类型标记符和引用计数器。要理解后者,需要继续前进,并简要看一下在对象生命的末期会发生什么。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~