我们来看一个小知识点
复制
list1 = list(range(5)) list2 = list(range(5)) print(list1 == list2) #返回的是True print(list1 is list2) #返回的是False
【==】只是对值得比较 ;【is】是对内存地址的判断
赋值 【只是把内存的指针的发生了改变】
这个过程有没有发生复制?
list1 = list(range(5)) list2 = list(range(5)) list1 = list2 list1[2] = 10 print(list1) print(list2) 结果: [0, 1, 10, 3, 4] [0, 1, 10, 3, 4]
并没有发生什么复制:只是告诉了你内存地址在哪里,指向发生了改变
小数据池
数字的小数据池范围
- 在同一代码块下,只要内容相同的内存地址(-5以后就不是了)
a = -5 b = -5 print(id(a)) #2057135152 print(id(b)) #2057135152
- 数字在做乘法的时候范围 【-5 ~ 256】
- 数字在做乘法的时候不能使用浮点数
字符串的小数据池
字符串的小数据池
- 在同一代码块下 只要内容相同就采用相同的内存地址
- 乘法的时候总长度不能超过20 ****
- 乘法的时候中文,特殊符号乘以0
布尔值的数据池范围
在同一代码块下 只要内容相同就采用相同的内存地址
总结
小数据池的验证方法,必须脱离代码块才能进行验证
先执行代码块的规则,在执行小数据的规则 --(驻留机制)
代码块:一个文件,一个函数,一个类,一个模块,终端中每一个行是一个代码块
深浅复制
浅拷贝:copy -> list
浅拷贝的时候,只会开辟一个新的容器列表,其他元素使用的都是源列表中的元素
# copy() -> list list1 = list(range(4)) list2 = list1.copy() print(id(list1)) #25807688 print(id(list2)) #31229432 print(list1 is list2) #False print(list1 == list2) #True print(id(list1[0])) #2057135232 print(id(list2[0])) #2057135232
我们发现copy后的list2,中的元素内存地址与list1中元素内存地址相同,而list1和list2的内存地址不相同
不可变元素/可变元素
# copy() -> list list1 = [1, [2, 3, 4], 5] list2 = list1.copy() list2[0] = 10 print(list1) #[1, [2, 3, 4], 5] print(list2) #[10, [2, 3, 4], 5]
原理图 :list2内存指针发生了改变,并没有影响到list1,所以list1中的元素没有跟随改变
# copy() -> list list1 = [1, [2, 3, 4], 5] list2 = list1.copy() list2[1][1] = 10 print(list1) #[1, [2, 10, 4], 5] print(list2) #[1, [2, 10, 4], 5]
原理图:list2中[2,3,4]本身就是个可变类型,在可变类型中修改元素,内存指针指向并没有发生改变,所以list1和list2中元素都发生了改变
浅拷贝总结
- 浅拷贝的时候只拷贝第一层元素
- 浅拷贝在修改第一层元素(不可变数据类型)的时候,拷贝出来的新列表不进行改变
- 浅拷贝在替换第一层元素(可变数据类型)的时候,拷贝出来的新列表不进行改变
- 浅拷贝在修改第一层元素中的元素(第二层)的时候,拷贝出来的新列表进行改变
深拷贝 copy -> list
深拷贝是基于浅拷贝的原理来的
- 深拷贝开辟一个容器空间(列表),不可变数据公用,可变数据数据类型(再次开辟一个新的空间),空间里的值是不可变的数据进行共用的,可变的数据类型再次开辟空间
对可变数据类型
import copy list1 = [1, [2, 3, 4], 5] list2 = copy.deepcopy(list1) list2[1].append(10) print(id(list1)) #22078168 print(id(list2)) #22047520 print(list1) #[1, [2, 3, 4], 5] print(list2) #[1, [2, 3, 4, 10], 5]
对不可变数据类型
list1 = [1, [2, 3, 4], 5] list2 = copy.deepcopy(list1) list2[0]=10 print(list1) #[1, [2, 3, 4], 5] print(list2) #[10, [2, 3, 4], 5]