python使用对象模型来存储数据,也就是说构造任何类型的值都是一个对象。所有的python对象都拥有三个特性:身份id,类型和值。
身份id:唯一的身份标识,可以使用内建函数id()来得到,这个值可以被认为是该对象的内存地址。对象身份的比较可通过运算符is或is not来完成,判断它们是否指向(引用)同一个对象,这里举一个有趣的例子:
>>> a = 1 >>> b = 1 >>> c = 1000 >>> d = 1000 >>> a is b True >>> c is d False >>> id(a), id(b), id(c), id(d) (11258984, 11258984, 12386056, 11594792)
可以看出,a和b指向同一个对象,但c和d却不同,这是为什么呢?这是因为,整数对象和字符串对象是不可变对象,python会很高效的缓存它们,不过整数对象仅缓存简单整数,如上面例子中的1,1000就不会缓存了。例子中,a is b等价于id(a) == id(b)。
类型:对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则,可以用内建函数type()查看python对象的类型,也可以用isinstance(),在python中类型也是对象。python有一系列的基本(内建)数据类型,其标准类型(基本数据类型)包括数字、整型、布尔型、长整型、浮点型、复数型、字符串、列表、元组和字典,还有一些其它的内建类型,它们是类型(类型本身也是类型)、Null对象(None,对应的布尔值为False,所有值为零的数的布尔值都是False,如整型、浮点型、长整型、复数、空字符串、空列表、空元祖、空字典等,而且定义了__nonzero__或__len__且值为0的类实例的布尔值也是False)、文件、集合、函数、模块和类,除此之外还包括一些内部类型,即代码(使用内建函数compile可以得到代码对象,然后可以被exec命令或eval内建函数来执行)、帧(包含python解释器在运行时所需要知道的所有信息)、跟踪记录(常用于异常)、切片(包括步进切片、多维切片、省略切片,可以由内建函数slice来生成)、省略(省略对象用于扩展切片语法中,起记号作用,表示省略号,有一个唯一的名字Ellipsis,布尔值为True)、Xrange(由内建函数xrange生成,是range的补充,前者用于需要节省内存使用或range无法完成的超大数据集场合)。types是一个与python类型相关的模块。
值:对象表示的数据项。布尔逻辑运算符包括and、or、not,对象值的比较除了一些常见的运算符(< > <= >= == !=)之外,还可以使用cmp()内建函数,如果是用户自定义对象,cmp()对调用该类的特殊方法__cmp__()。对于字符串来说,内建函数str(obj)返回对象适合可读性好的字符串表示,而另一个内建函数repr(obj)返回一个对象的字符串表示,通常情况下obj == eval(repr(obj))这个等式是成立的。可以这么说,repr()的输出对python比较友好,str()的输出对人比较友好。
某些python对象有属性、值或相关的可执行代码,比如方法(method),python用点(.)标记法来访问属性,属性包括相应对象的名字等等,最常用的属性是函数和方法,不过有一些python类型也有数据属性,含有数据属性的对象包括(但不限于)类、类实例、模块、复数和文件等。
上面提到的类型可按照三种不同的模型进行分类:存储模型、更新模型、访问模型。
存储模型分两种——
原子类型(标量类型):数值(所有的数值类型)、字符串(全部是文字)。
容器类型:列表、元组、字典。
更新模型分两种——
可变类型:列表、字典。
不可变类型:数字、字符串、元组。
访问模型分三种——
直接访问:数字。
顺序访问:字符串、列表、元组。
映射访问:字典。
最后,说明一下python的类型工厂函数,新式的python统一了类型和类,所有的内建类型现在也都是类,在这基础上,原来的所谓内建转换函数像int()、type()、list()等等,现在都成了工厂函数,也就是说虽然他们看上去有点像函数,实质上它们是类,当你调用它们时,实际上是生成了该类型的一个实例,就像工厂生产货物一样。下面的工厂函数在老的python里被称为内建函数:
int() long() float() complex()
str() unicode() basestring()
list() tuple()
type()
新添加的工厂函数:
dict()
bool()
set() frozenset()
object()
classmethod()
staticmethod()
super()
property()
file()