基本概念
首先要分清几个概念,什么是对象?什么是抽象?什么是容器?对象有什么特征?
根据python文档总结如下:文档>>Python语言参考>>3.数据模型
① 抽象:从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃的思维过程
② 对象是 Python 中对数据的抽象,Python程序中的所有数据都是由对象或对象间关系来表示的
③ 容器:一些对象包含对其他对象的引用,这些对象称为容器,如列表,元组,字典
④ 对象的三个特征
标识符 (identity):唯一不可更改,可理解为对象在内存中的地址,is操作符可比较两个对象的 identity,id() 函数返回一个对象的 identity
类型 (type):决定对象操作和取值,不可更改
值 (value):有些对象的值可以改变,值可以改变的对象被称为可变的 (mutable),值不可以改变的对象就被称为不可变的 (immutable)
可变对象和不可变对象
① 数字,字符串,元组为不可变,字典和列表可变
② 在这里要注意对于容器而言可变和不可变有所不同,如果一个不可变 tuple 容器包含对可变对象的引用,当可变对象值改变的时候 tuple 的值也会改变
但是 tuple 仍然是不可变的,因为包含的可变对象的 id 不变
下面会以 list 和 tuple 具体举例分析
>>> list = ['a', 'b']
>>> id(list) # 列表唯一id
60968648L
>>> id(list[0]) # 包含对象id
59715296L
>>> list[0] = 'c'
>>> list
['c', 'b']
>>> id(list) # 列表唯一id不变
60968648L
>>> id(list[0]) # 新对象被构造,即id改变
59711896L
>>> tuple = (['a', 'b'], 'c')
>>> id(tuple) # 元组唯一id
61112904L
>>> id(tuple[0]) # 元组包含对象id
61114184L
>>> tuple[0][1] = 'z'
>>> tuple
(['z', 'b'], 'c')
>>> id(tuple) # 元组唯一id
61112904L
>>> id(tuple[0]) # 无新对象构造,包含的列表id不变,列表值改变
61114184L