要想明白什么是深拷贝什么是浅拷贝,那么就要明白是什么是可变对象什么是不可变对象。
什么是可变对象,什么是不可变对象:
可变对象是指:一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值;(地址不变,值可变)
不可变对象是指:一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了,但是可变对象就不会做这样的动作,而是直接在对象所指的地址上把值给改变了,而这个对象依然指向这个地址。(地址变了,改变copy对象,我自己不变)
什么是深拷贝,什么是浅拷贝:
浅拷贝:能够拷贝a中的父对象,不会拷贝子对象,也不拷贝id;那么a的父子对象都改变 c中的父对象不变,但是子对象会变
深拷贝:拷贝的就是a的值,也不拷贝id;那么a的父子对象改变了,d是不会变的。
举个例子:
#!/usr/bin/python
# -*-coding:utf-8 -*-
import copy
a = [1,2,3,4,['a','b']] #原始对象
b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝 ,深拷贝
print 'a:',a,'<a_id>',id(a)
print 'b:',b,'<b_id>',id(b)
print 'c:',c,'<c_id>',id(c)
print 'd:',d,'<d_id>',id(d)
print '___________________________________'
a.append(5) #父对象改变
a[4].append('c')#子对象改变
print 'a:',a,'<a_id>',id(a)
print 'b:',b,'<B_id>',id(b)
print 'c:',c,'<c_id>',id(c)
print 'd:',d,'<d_id>',id(d)
"""a = b 那么就是b指向的就是a的地址和值
c=copy.copy(a)那么就是浅拷贝,能够拷贝a中的父对象,不会拷贝子对象,也不拷贝id
那么a的父子对象都改变 c中的父对象不变,但是子对象会变
d= copy.deepcopy(a) 是深拷贝,拷贝的就是a的值,也不拷贝id
那么a的父子对象改变了,d是不会变的。"""
输出结果: