1.列表与元组的区别
- 元组用于存储无需变化的数据,所以采用“按需分配”的存储机制
- 列表用于存储需要变化的数据,所以采用“预留空间”的存储机制
元组的应用场景
- 保护数据,当一些数据我们不想被修改的时候可以用元组来保持。
- 函数的返回值,当函数有多个返回值的时候我们可以用元组来返回。
- 拆包
列表,元组都能进行拆包,那为什么要使用元组呢,因为元组没有预留空间,所占的内存空间小。那什么是预留空间呢?那这就要提到可变数据了,列表是可变的,而元组是不可变的,那可变数据为什么可变呢?
2.可变数据为什么可变
- 存储机制:预留空间 + 自动扩容
- 自动扩容:开辟更大空间,拷贝原始数据,替换内存地址
那可变数据在内存图中是如何变化的呢?
因为列表有预留空间,所以在进行增加的时候,就直接可以把数据的内存地址保存到预留的空间中。
那既然有了预留空间,那自动扩容还有什么用呢?
预留空间不是无限的,它总有用完的时候,但预留空间用完的时候就会自动扩容,自动扩容拷贝原始数据,替换了内存地址,开辟了更大的空间。而原始数据就变成了垃圾,等待着被垃圾回收器回收掉。
不可变数据为什么不可变
不可变数据是按需分配,当数据发生改变的时候不会在数据原在的空间中进行修改,因为那块空间是用来存储原数据的,是按照原数据的大小进行内存分配的,我们不能确定新数据的大小,所以不能确定能不能存到原来的内存空间中,所以当想改变不可变数据时,内存中是分配了一个空间大小符合数据的新空间将新数据存储。
总结:不可变数据为什么不可变,因为不可变数据的内存大小是按需分配的。
我们来看看一道面试题,高级一点的回答。
面试题:Python语言有哪些数据类型?
答:Python有两种数据类型
1.可变数据类型
它们有list, set, dict 其中dict的值是可变的键不可变。
内存机制:预留空间 + 自动扩容,每次改变都会产生新数据,旧数据成为垃圾。
2.不可变数据类型
它们有int, float, str, tuple, complex,bool
内存机制:按需分配,每次改变都会产生新数据,旧数据会成为垃圾。