python中包含复制 浅拷贝与深拷贝
1.复制
复制没有拷贝子对象,未开辟新内存空间,也没有产生新object,所以原始数据改变,复制后的object也会改变
①最常见的赋值操作就属于复制
python中赋值操作实质就是对object的引用,是对当前object的引用的拷贝,不是对当前object的拷贝
2.浅拷贝shallow copy
②copy模块中的copy.copy()属于浅拷贝操作函数
3.深拷贝deep copy
包含对象里面的自object的拷贝,划分一块新的内存空间,生成一个新object,所以原始对象的改变不会造成深拷贝里任何子元素的改变
>>> aa=['3','45','456'] #列表
>>> bb=aa #直接赋值
>>> cc=copy.copy(aa) #浅拷贝
>>> dd=copy.deepcopy(cc) #深拷贝
>>> id(aa)
45129096L
>>> id(bb)
45129096L
>>> id(cc)
45185160L
>>> id(dd)
45129032L
4.copy() 与deepcopy()
针对简单变量,两种操作是没有区别的,在面对复杂object时有区别,所谓复杂object,是指object中含其他object(如复杂的 list 和 class)。
由 shallow copy 创建的新object开辟了新的空间,但新object里面的子object是对旧object引用的拷贝,依然指向自己在原来本体中对应的子object。而 deep copy 建立的复杂object中,存储的则是本体中子object的 copy,并且会层层如此 copy 到底,相当于对object里的各层进行递归copy。
In [1]: import copy
In [2]: a=['1','2','3',['aa','bb']]
In [3]: b=a
In [4]: c=copy.copy(b)
In [5]: d=copy.deepcopy(a)
In [6]: c=copy.copy(a)
In [7]: a.append('4')
In [8]: a[3].append('cc')
In [9]: a
Out[9]: ['1', '2', '3', ['aa', 'bb', 'cc'], '4']
In [10]: b
Out[10]: ['1', '2', '3', ['aa', 'bb', 'cc'], '4']
In [11]: c
Out[11]: ['1', '2', '3', ['aa', 'bb', 'cc']]
In [12]: d
Out[12]: ['1', '2', '3', ['aa', 'bb']]
注:
①其中a.append('4')在浅拷贝和深拷贝后生成的新object都不会因为老object变化而变化,故a中尾部插入数据不对新object c和d 产生影响
② a[3].append('cc'),在浅拷贝中,新object c中的子对象['aa','bb']依然是对a中['aa','bb']的子object的引用,c中子对象会因a子object的变化而变化,故c中子object变为['aa', 'bb', 'cc'],在深拷贝中d的object及object内部的,是完全对立的地址空间,完全不改变