6、可变与不可变类型和深浅拷贝

本文探讨了Python中的可变与不可变类型,解释了字典、列表等数据结构的ID变化规则。同时,详细阐述了浅拷贝和深拷贝的区别,通过示例展示了它们在处理可变类型数据时的不同影响。强调了深拷贝能够确保原始数据与拷贝数据的独立性。
摘要由CSDN通过智能技术生成

可变和不可变类型

  • 可变数据类型: 堆区的值改变了,但是值对应的id不变,容器类型的数据都是可变类型的,如:list、dict
  • 不可变类型: 堆区的值改变了,值对应的id也发生了改变,如:int、floating、str、bool
a = {"name":"lzz","age":24,"lover":"everyone"}
print(id(a))
a["name"]="leo"
print(a,id(a))

注意: 字典的key必须为不可变类型,否则报错,value可以是任意类型

深浅拷贝

浅拷贝
不区分数据的类型,直接将索引对应的内存地址拷贝进来,相当于只拷贝了一层,对于可变类型的数据,原数据和拷贝的数据是分不开的。
list1=["lzz",234,[1,2]]
list2=list1.copy()
list1[2][0]="xin"   #原数据和拷贝的数据都会发生变化
print(list1,list2)
print(id(list1[0]),id(list1[1]),id(list2[2]),id(list1[2][0]),id(list1[2][1]))
print(id(list2[0]),id(list2[1]),id(list2[2]),id(list2[2][0]),id(list2[2][1]))

深拷贝
区分数据类型,会将不可变类型的数据对应的到内存地址拷贝过来。会产生新的内存地址指向可变类型的数据。因为区分了可变类型和不可变类型,所以原数据和拷贝的数据之间是互不影响的。
import copy
list1=["lzz",234,[1,2]]
list2=copy.deepcopy(list1)
list1[2][0]="xin"     #原数据发生了改变,但是拷贝的数据不受影响
print(list1,list2)
print(id(list1[0]),id(list1[1]),id(list2[2]),id(list1[2][0]),id(list1[2][1]))
print(id(list2[0]),id(list2[1]),id(list2[2]),id(list2[2][0]),id(list2[2][1]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据工匠大壮

请狠狠粗暴的爱我!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值