1.内存相关
-
- == 和 is有什么区别
- == 用于比较值是否相等
- is 用于比较内存地址是否相等
- 2.小数据池/小整数缓存机制/驻留机制
- 为了优化速度和内存使用设计,在一定范围内对整数进行复用,通常是[-5, 256]
- 由数字、字母、下划线组成的字符串简单字符串本身或*1时,符合小数据池
- 由非数字、字母、下划线组成,并且乘以大于1的数,重新开辟内存来存储字符串
v1 = "alex" v2 = "alex" v3 = "alex_*"*5 v4 = "alex_*"*5 v5 = "zhangsan_666"*1 v6 = "zhangsan_666"*1 v7 = "lisi*" v8 = "lisi*" print(id(v1), id(v2)) # 4457566816 4457566816 print(id(v3), id(v4)) # 4457659600 4457659680 print(id(v5), id(v6)) # 4457623024 4457623024 print(id(v7), id(v8)) # 4457569264 4457568832
- 3.哈希
- 列表、字典、集合是可变类型,不能放在集合中且不能作为字典的key(unhashable)
- Python内部会将值进行哈希算法并得到一个数值(对应内存地址),以后用于快速查找
- 存储100万个数的列表,在查找时花费时间较多
- 对于集合、字典等不可变类型,每一个值(如字典的key)经过hash运算得到一个内存地址,后续直接通过它找到数据,速度比列表快得多
- 4.不同数据类型嵌套存储示例
- 1.修改简单列表的元素
v1 = [1, 2, 3] v1[0] = 999
- 2.列表内部嵌套列表
v1 =[1, 2, [9, 8], "alex"]
- 3.列表名作为列表元素
v1 = [1, 2]
v2 =[1, 2, v1]
v1[0] = "奇"
v1 = [1, 2]
v2 =[1, 2, v1]
v2[2] = 123
- 4.列表中嵌套字典
data_list = []
for i in range(4):
data = {}
data['user'] = i
data_list.append(data)
- 5.深拷贝与浅拷贝
- 1.普通列表
v1 = [1, 2, 3] v2 = copy.copy(v1) # 只拷贝了v1指向的三个内存空间的地址,存储的内容依然是v1指向的1 2 3 v3 = copy.deepcopy(v1) # 找到内部所有可变部分(列表的空壳子)拷贝一份,由于小数据池,所以和浅拷贝得到的结果一致
- 2.嵌套列表
v1 = [1, 2, [33, 99]]
v2 = copy.copy(v1) # 把最外层的3元素列表空壳拷贝一份
v3 = copy.deepcopy(v1) # 把第1层和第2层的可变类型(列表)都拷贝一份,由于小数据池,数据没有重新拷贝
- 3.总结
- 浅拷贝只拷贝第1层(变量的指向)
- 深拷贝拷贝嵌套层次中的所有可变类型