Data Model

Python的数据模型

本文基于Python 3.5.2官方文档中数据模型部分完成 1.对象,值 和 类型 Python把数据抽象为Objects。Python程序中所有的数据都体现为对象,或者对象之间的关系。(从某种程度上讲,为了与冯.诺伊曼的存储程序型计算机模型相一致,代码同样也体现为对象。) 每个对象都有一个标识,一个类型和一个值。对象一旦创建,它的标识就不会变更;你可以理解为它就像对象在内存中的地址。is操作用来比较两个对象的标识;id()函数返回一个整数来表示它的标识。 CPython实现细节:id(x)返回x在内存的存放地址。 对象的类型决定了对象支持哪些操作(比如,这个对象有长度吗?),同时也定义了对象中可能存在哪些值。type()函数返回一个对象的类型(类型也是一个对象)。就像它的标识,一个对象的类型也是不可变的。 一些对象的值是可修改的。可以修改的的对象被称为可变的to be mutable;创建后不能修改的对象被称为不可变的immutable。(不可变容器对象的值如果是一个可变对象的引用,那么当后者的值发生改变的时候,前者的值也会改变;但是这个容器仍然被认为是不可变的,因为容器内部包含的对象都没有发生变化。所以,不可变性immutability并不意味着拥有一个不可修改的值unchangeable,这很微妙)。一个对象是否可变取决于它的类型;比如:数字、字符串、元组是不可变的,字典和数组是可变的。 对象不会明确的被销毁;只有当它们不可达的时候,它们才有可能被垃圾回收。只要可达的对象不要被回收掉,如何实现延迟垃圾回收,并统一释放他们,这就是垃圾回收的实现质量问题了。 CPython实现细节:CPython现在使用引用计数机制和(可选的)循环垃圾延迟检测机制,对象一旦不可达就尽量收集,但是无法保证能回收循环引用的垃圾。查看gc模块的文档,来了解更多关于如何回收循环引用垃圾的信息。其他的实现可能不一样,而且CPtyhon也可能会改变策略。不要指望对象不可达以后,就会马上会被回收掉(所以你总是应该明确的关闭文件)。 注意跟踪调试工具会让一些本该回收掉的对象始终可达。同时使用try...except处理异常也会使对象始终可达。 一些对象包含对”外部”资源的引用。我们知道当这些对象被垃圾回收后这些资源也会被释放,但是因为垃圾回收不能保证这些对像会被回收,所以这些对象会提供一个明确方式来释放资源,通常是close()函数。强烈建议在程序中明确的关闭这样的对象。可以用try...finally语句和with语句来方便的执行它。 一些对象包含对其他对象的应用;这些对象叫做容器containers。这样的例子有元组、数组和字段。应用是容器的值的一部分。大部分的情况下,当我们说起容器中的值,指的是值,而不是容器内对象的标识;而当我们说容器的可变性,指的是容器中当前对象的标识。所以,一个不可变容器(比如元组)包含一个可变对象的引用,它的值是可变的,当那个可变对象发生变更的时候。 类型几乎影响了对象的所有行为。在一些场景下甚至影响对象标识的重要性:对于不可变类型,计算新值的操作可能实际返回的是一个已存在的,拥有相同类型和值的对象的引用;而对于可变对象这是不允许的。比如,执行a=1; b=1,a 和 b 可能(也可能不是)指向同一个包含1的对象,取决于具体实现; 但是执行c=[];d[],c 和 d 保证指向两个完全不同的,独立的,新创建的空数组。(注意,c = d = [] 将同一个对象分配给了c 和 d 。) 2.标准类型层级 下边是Python中内建类型列表。扩展模块(由C,Java,或其他语言实现的)会定义附加的类型。未来版本的 Python 可能会在此类型层次中增加新的类型 (例如:有理数,高效存储的整数数组等),不过这些类型通常是在标准库中定义的。 以下个别类型描述中可能有介绍特殊属性的段落,它们是供实现访问的,不作为一般用途。这些定义在未来有可能发生改变: None 这个类型只具有一个值,并且这种类型也只有一个对象,这个对象可以通过内建名字None访问,在许多场合里它表示无值,例如,没有显式返回值的函数会返回None。这个对象的真值为假。 NotImplemented 这个类型只具有一个值,并且这种类型也只有一个对象。这个对象可以通过内建名字NotImplemented访问。如果操作数没有对应实现,数值方法和复杂比较方法rich comparison method应该返回这个值 (解释器会尝试反射操作,或者其它操作,根据具体的操作)。它的真值为真。 Ellipsis 这个类型只具有一个值,并且这种类型也只有一个对象。这个对象可以通过字面值 … 或者内建名字 Ellipsis 访问。它的真值为真。 numbers.Number 它们由数值型字面值产生,或者是算术运算符和内建数学函数的返回值。数值型对象是不可变 的,即一旦创建,其值就不可改变。Python 数值型和数学上的数字关系当然是非常密切的,但也受到计算机数值表达能力的限制。 Python 区分整数,浮点数和复数: numbers.Integral 描述了数学上的整数集 (正负数). 有两类整数: Integers (int)