今天的目录是
1.小数据池
2.深浅copy
正文开始
1.小数据池
在说明今天的内容前,先说明一个在今天重复用到的一个知识点
###比较’=’俩边的数据是否完全相同,以及判断一个对象的内存地址是否完全相同###
#今天的内容深入研究还是很难再短时间内讲清楚,今天只是浅浅的讲一下
1.1#is判断等号俩边的数据是否相等
#id判断一个对象的内存地址是否完全相同
name ='alex'
name1 ='alex1'
print(id(name))
print(id(name1))
print(name is name1)
#结果
2434239272024
2434240176512
False
可以明显的看到俩个name的值虽然相同,可是俩者在内存中的地址是完全不同的
1.2 python中的俩种优化机制
1.2.1 代码块
代码块:代码全部都是基于代码块去实现的(好比一个学校给一个班级下发命令),一个文件就是一个代码块,不同的文件就是不同的代码块
终端:对于终端,例如pc中的cmd执行python,一行就是一个代码块
代码块的缓存机制:
python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用
换一句话说:在执行同一个代码块的时候,遇到新的变量,会将初始化的这个变量与值存储在一个字典中,遇到新的变量,会先从字典中查询记录,如果有重复的值则重复利用
注意:机制只能在同一个代码块下才能实现,满足此机制的数据类型有:int str bool
优点:
1.节省内存
2.提升性能
1.2.2 小数据池
小数据池:又叫驻留机制,驻村机制,字符串的驻存机制,字符串的缓存机制等等,主要是用于不同代码块的优化
适应的数据类型:str bool int
int:-5~256
str:一定条件下的str满足小数据池
bool值全部
优点:
1.节省内存
2.提升性能
总结:如果在同一个代码块中,用同一个代码块中的缓存机制,如果在不同的代码块中,用小数据池
2.深浅copy
l1 =[1,2,3,4]
l2 = l1
l2.append(666)
print(l1,l2)
#结果
[1, 2, 3, 4, 666] [1, 2, 3, 4, 666]
2.1 浅copy
在内存中创建一个新的list(dict),但是新的列表中的元素还是与原列表共用一个
l1 =[1,2,3,4]
l2 = l1
l2.append(666)
print(l1,l2)
l1 = [1, 'alex', [11,22]]
l2 = l1.copy()
print(id(l1),id(l2))
l1.append(33)
print(l1,l2)
print(id(l1[0]))
print(id(l2[0]))
print(id(l1[-1]))
print(id(l2[-1]))
print(l1 is l2)
l1[-1].append(666)
print(l1)
print(l2)
图示如下
2.2 深copy
深copy会在内存中对原列表(dict)以及列表里面的可变的数据类型重新创建一份,而列表中不可变的数据类型还是沿用原来的。
import copy
l1 = [1, 'alex', [11,22]]
l2 = copy.deepcopy(l1)
# l1[0] = 1000
print(l1)
print(l2)
# print(id(l1))
print(id(l2))
print(id(l1[-1])) #
print(id(l2[-1])) #
print(id(l1[0]))
print(id(l2[0]))
l1[-1].append(666)
print(l1)
print(l2)
全切得到的列表是对原列表进行的浅copy
l1 = [1, 2, 3, [22,33]]
l2 = l1[:] # [::] #列表的全切
l1[-1].append(666)
print(l2)
图示如下
正常情况如下
在python内部机制优化后,对于int,str,元祖等不可变量继续沿用copy前的内存地址,对于列表字典等可变元素采用开辟新的空间
图示如下