浅拷贝和深拷贝的区别
-- 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()方法添加原列表并且列表里面的列表元素同时添加,浅拷贝的列表不会添加,但是列表中的列表元素会添加。深拷贝的列表和列表元素都不会添加。