如果让我们最啰嗦的描述标准类型,我们也许会称它们是Python 的“基本内建数据对象原始类型”。
z “基本”,是指这些类型都是Python 提供的标准或核心类型。
z “内建”,是由于这些类型是Python 默认就提供的
z “数据”,因为他们用于一般数据存储
z “对象”,因为对象是数据和功能的默认抽象
z “原始”,因为这些类型提供的是最底层的粒度数据存储
z “类型”,因为他们就是数据类型
有三种不同的模型可以帮助我们对基本类型进行分类,每种模型都展示给我们这些类型之间的相互关系。这些模型可以帮助我们更好的理解类型之间的相互关系以及他们的工作原理。
存储模型
我们对类型进行分类的第一种方式, 就是看看这种类型的对象能保存多少个对象。Python的类型, 就象绝大多数其它语言一样,能容纳一个或多个值。一个能保存单个字面对象的类型我们称它为原子或标量存储,那些可容纳多个对象的类型,我们称之为容器存储。容器类型又带来一个新问题,那就是它是否可以容纳不同类型的对象。
所有的Python 容器对象都能够容纳不同类型的对象。
字符串看上去像一个容器类型,因为它“包含”字符(并且经常多于一个字符),不过由于Python 并没有字符类型,所以字符串是一个自我包含的文字类型。
分类 Python 类型
标量/原子类型 数值(所有的数值类型),字符串(全部是文字)
容器类型 列表、元组、字典
更新模型
另一种对标准类型进行分类的方式就是, 针对每一个类型问一个问题:“对象创建成功之后,它的值可以进行更新吗?” 在前面我们介绍Python 数据类型时曾经提到,某些类型允许他们的值进行更新,而另一些则不允许。可变对象允许他们的值被更新,而不可变对象则不允许他们的值被更改。
x = 'Python numbers and strings'
x = 'are immutable?!? What gives?'
i = 0
i = i + 1
“在我看来, 这可不象是不可变对象的行为!” 没错,是这样,不过你还没有搞清楚幕后的真相。上面的例子中,事实上是一个新对象被创建,然后它取代了旧对象。新创建的对象被关联到原来的变量名, 旧对象被丢弃,垃圾回收器会在适当的时机回收这些对象。你可以通过内建函数id()来确认对象的身份在两次赋值前后发生了变化。
分类 Python 类型
可变类型 列表, 字典
不可变类型 数字、字符串、元组
访问模型
尽管前面两种模型分类方式在介绍Python 时都很有用,它们还不是区分数据类型的首要模型。对这种目的,我们使用访问模型。也就是说根据访问我们存储的数据的方式对数据类型进行分类。在访问模型中共有三种访问方式:直接存取,顺序,和映射。
分类 Python 类型
直接访问 数字
顺序访问 字符串、列表、元组
映射访问 字典