python中的对象拷贝


python中无论参数传递还是函数返回值,都是进行引用传递。那如何拷贝对象呢,标准库的copy模块提供了两个方法:copy和deepcopy方法。

1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。
2. copy.deepcopy 深拷贝 拷贝对象及其子对象

见下例:

import copy
a = [1, 2, 3, 4, ['a', 'b']]  #原始对象

e = a[:] 		#利用分片操作进行拷贝(浅拷贝)
b = a  			#赋值,传对象的引用
c = copy.copy(a)  	#对象拷贝,浅拷贝
d = copy.deepcopy(a)  	#对象拷贝,深拷贝

a.append(5)  		#修改对象a
a[4].append('c') 	#修改对象a中的['a', 'b']列表子对象

print 'a = ', a
print 'b = ', b
print 'c = ', c
print 'd = ', d
运行结果:

a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c = [1, 2, 3, 4, ['a', 'b', 'c']]
d = [1, 2, 3, 4, ['a', 'b']]
e = [1, 2, 3, 4, ['a', 'b', 'c']]
分析:

b是a的一个引用,两者指向的对象相同,打印结果必然相同。c只拷贝了a的中的父对象,对于a中嵌套的子对象列表并没有拷贝,所以c中的1,2,3,4是拷贝得到的副本,属于自己的,但嵌套的子对象列表还是a原来的。d的话,由于是深拷贝,所以子对象父对象都是拷贝生产的新的副本,完全不所原来a的影响。至于e,分片操作的效果等价于浅拷贝,结果和c相同。


另外,字典还有自己的copy方法,但没有deepcopy方法,其copy方法和上面的copy模块中的copy方法一样,也是实现的浅拷贝。


评论关闭