深拷贝与浅拷贝

151 阅读2分钟

1.本质区别

两者都是对象的拷贝,会生成看起来相同的对象,其本质区别是复制的是地址还是值
"值"可以认为是新的对象包含原对象所有指向的数据

2.可变对象与不可变对象

区别:在对象地址不改变的情况下,可不可以改变其内的值。在一个对象中浅层次数据是不可变元素,深层次数据是可变元素

3.深拷贝与浅拷贝在拷贝时可变对象与不可变对象的区别

浅拷贝会生成与原对象不同的地址,但是新对象里的不可变元素和原对象的不可变元素地址是一样的,拷贝的的是浅层次的数据结构,而深层次的数据(可变元素)并没有被一同拷贝过去,所以新对象或原对象在对所指向的深层次的可变元素做更改时,两个对象都会改变。深拷贝则不会改变

3.举例

代码示例:

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])

输出结果如下图:

oo