浅拷贝和深拷贝的区别,简单易懂

浅拷贝和深拷贝的区别

-- coding: utf-8 --

@Time : 2020/10/25 14:28

@Author :

@File : copy and deepcopy.py

@Project : demo

import copy
a=[1,2,3,4,5,['a','b']]
#原始对象
b=a#赋值,传对象的引用
c=copy.copy(a)#对象拷贝,浅拷贝
d=copy.deepcopy(a)#对象拷贝,深拷贝
print("a=",a,"    id(a)=",id(a),"id(a[5])=",id(a[5]))
print("b=",b,"    id(b)=",id(b),"id(b[5])=",id(b[5]))
print("c=",c,"    id(c)=",id(c),"id(c[5])=",id(c[5]))
print("d=",d,"    id(d)=",id(d),"id(d[5])=",id(d[5]))
print("*"*70)

a.append(6)#修改对象a
a[5].append('c')#修改对象a中的['a','b']数组对象
print ("a=",a,"    id(a)=",id(a),"id(a[5])=",id(a[5]))
print ("b=",b,"    id(b)=",id(b),"id(b[5])=",id(b[5]))
print ("c=",c,"       id(c)=",id(c),"id(c[5])=",id(c[5]))
print ("d=",d,"            id(d)=",id(d),"id(d[5])=",id(d[5]))
a= [1, 2, 3, 4, 5, ['a', 'b']]     id(a)= 2011278955400 id(a[5])= 2011278954888
b= [1, 2, 3, 4, 5, ['a', 'b']]     id(b)= 2011278955400 id(b[5])= 2011278954888
c= [1, 2, 3, 4, 5, ['a', 'b']]     id(c)= 2011300041736 id(c[5])= 2011278954888
d= [1, 2, 3, 4, 5, ['a', 'b']]     id(d)= 2011280226760 id(d[5])= 2011299276168
**********************************************************************
a= [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]     id(a)= 2011278955400 id(a[5])= 2011278954888
b= [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]     id(b)= 2011278955400 id(b[5])= 2011278954888
c= [1, 2, 3, 4, 5, ['a', 'b', 'c']]        id(c)= 2011300041736 id(c[5])= 2011278954888
d= [1, 2, 3, 4, 5, ['a', 'b']]             id(d)= 2011280226760 id(d[5])= 2011299276168

深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝

浅拷贝:改变列表地址,如果元素里面有列表,元素是列表的地址不变
所以append添加原列表,浅拷贝的列表不会
id(a) != id© != id(d)
id(a[5]) == id(c[5])

深拷贝:改变列表地址,同时也改变元素是列表的地址
id(a) != id© != id(d)
id(a[5]) != id(d[5])

总结:
所以append()方法添加原列表并且列表里面的列表元素同时添加,浅拷贝的列表不会添加,但是列表中的列表元素会添加。深拷贝的列表和列表元素都不会添加。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值