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