python中深拷贝与浅拷贝的区别

####################python中的数据类型#######################
##########python中的数据类型有6种,分别为:数字类型如int,float、字符串类型、列表类型(list)、元组类型(tuple)、集合类型(set)、字典类型(dict)。其中数字类型&字符串&元组类型是不可变类型,list&set&dict是可变类型。
########深拷贝与浅拷贝的区别,python中copy.copy()实现浅拷贝,copy.deepcopy()实现深拷贝。深浅拷贝的实现主要和内存有关##############
########深拷贝与浅拷贝都是拷贝了一个看起来相同的对象,但是本质区别是拷贝出来的对象的中的可变元素的地址是否和原对象一样###############
########深拷贝:拷贝了一份与原对象地址不同的对象,原对象的值如何改变都不会影响深拷贝后的对象的值。通俗的举例:深拷贝相当于一对双胞胎,A与B虽然长的极其相似但是A与B是不同的两个人,A的操作完全不影响B
########浅拷贝:拷贝了一份原对象中的各元素的地址与值,即只要原对象中可变元素发生改变,那么浅拷贝对象的值也会发生改变。通俗的举例:某人有中英文两个名,那么中文名干了某事代表英文名也干了这件事。
########对于不可变类型的对象(数字、字符串、元组),浅拷贝与深拷贝的结果并无区别,即深拷贝或浅拷贝后的对象的地址与值完全一样。如下所示#########################
print("########################对于不可变类型对象只有深拷贝没有浅拷贝####################")
import copy
a="hello world"
c=copy.deepcopy(a)
print(id(a))
print(id(c))
a+=" !!!"####a发生改变后地址也发生改变
print(a)
print(c)
print(id(a))
########对于可变类型的对象(list&set&dict),分为两种情况。情况1:可变类型对象中的元素都是非可变类型的,例如:[1,2,3,4,5];情况2:可变类型对象中的元素包含可变类型,例如[1,2,3,[4,5]]##########
########对于情况1:原对象的地址!=浅拷贝对象的地址!=深拷贝对象的地址但是原对象中各元素的地址==浅拷贝对象中各元素的地址==深拷贝对象中各元素的地址########################
#######如果对原对象进行操作,不影响浅拷贝和深拷贝的对象####################
print("#####################对于元素都为不可变类型的可变类型的对象的浅拷贝与深拷贝################")
d=[1,2,3]
e=copy.copy(d)
f=copy.deepcopy(d)
print(id(d))
print(id(e))
print(id(f))
ls_d=[id(i) for i in d]
ls_e=[id(i) for i in e]
ls_f=[id(i) for i in f]
print(ls_d)
print(ls_e)
print(ls_f)
d.append(5)
print(d,e,f)
#######对于情况2:原对象地址!=浅拷贝对象地址!=深拷贝对象地址但是【原对象中不可变元素的地址==浅拷贝对象中不可变元素的地址==深拷贝对象中不可变元素的地址】&&【原对象中可变元素的地址==浅拷贝对象中可变元素的地址!=深拷贝对象中的地址】
print("##################对于元素中有可变类型的对象的浅拷贝与深拷贝#####################################")
h=[1,2,3,[4,5,6]]
m=copy.copy(h)
n=copy.deepcopy(h)
print(id(h))
print(id(m))
print(id(n))
ls_h=[id(i) for i in h]
ls_m=[id(i) for i in m]
ls_n=[id(i) for i in n]
print(ls_h)
print(ls_m)
print(ls_n)
h.append(7)
h[3].append(9)
print(h)
print(m)
print(n)

原文链接:https://blog.csdn.net/jiao_mrswang/article/details/126999958

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值