数据类型总结
按存储空间的占用分-从低到高(了解)
- 数字
- 字符串
- 集合:无序,即无序存索引相关信息
- 元组:有序,需要存索引相关信息,不可变
- 列表:有序,需要存索引相关信息,可变,需要处理数据的增删改
- 字典:无序,需要存key与value映射的相关信息,可变,需要处理数据的增删改
按存值个数区分(掌握)
存值个数 | 数据类型 |
---|---|
单个值 | 数字,字符串 |
多个值(容器) | 列表,元组,字典,集合 |
按可变不可变区分(掌握)
可变or不可变 | 数据类型 |
---|---|
可变 | 列表,字典,集合 |
不可变 | 数字,字符串,元组 |
有序无序区分(掌握)
有序or无序 | 数据类型 |
---|---|
有序(可按索引取值) | 字符串,列表,元组 |
无序 | 字典,集合 |
按访问类型区分(了解)
访问类型 | 数据类型 |
---|---|
直接访问 | 数字 |
顺序访问(序列类型) | 字符串,列表,元组 |
key值访问(映射类型) | 字典 |
浅拷贝和深拷贝
在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用
针对该列表alist=[1,2,3,["a","b"]]
一般有三种方法,分别为:拷贝(赋值)、浅拷贝、深拷贝
拷贝(赋值)
直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变
alist=[1,2,3,['a','b']]
b = alist
print(b)
alist.append(5)
print(alist)
print(b)
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b'], 5]
浅拷贝
copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变
>>> import copy
>>> c=copy.copy(alist)
>>> print(alist)
>>> print(c)
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print(alist)
[1, 2, 3, ['a', 'b'], 5]
>>> print(c)
[1, 2, 3, ['a', 'b']]
>>> alist[3]
['a', 'b']
>>> alist[3].append('cccc')
>>> print(alist)
[1, 2, 3, ['a', 'b', 'cccc'], 5]
>>> print(c)
[1, 2, 3, ['a', 'b', 'cccc']] # 里面的子对象被改变了
深拷贝
深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变
>>> import copy
>>> d=copy.deepcopy(alist)
>>> print alist;print d
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']] # 始终没有改变
>>> alist.append(5)
>>> print(alist)
[1, 2, 3, ['a', 'b'], 5]
>>> print(d)
[1, 2, 3, ['a', 'b']] # 始终没有改变
>>> alist[3]
['a', 'b']
>>> alist[3].append("ccccc")
>>> print(alist)
[1, 2, 3, ['a', 'b', 'ccccc'], 5]
>>> print(d)
[1, 2, 3, ['a', 'b']] # 始终没有改变