Python:小数据池,深浅复制

本文详细解释了Python中浅拷贝(list.copy())与深拷贝(copy.deepcopy())的区别,涉及内存地址、复制过程以及可变与不可变元素的影响。通过实例演示了浅拷贝仅复制一层,而深拷贝对可变数据类型进行完整复制的过程。
摘要由CSDN通过智能技术生成

我们来看一个小知识点

 复制

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]

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值