python中无论参数传递还是函数返回值,都是进行引用传递。那如何拷贝对象呢,标准库的copy模块提供了两个方法:copy和deepcopy方法。
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。
2. copy.deepcopy 深拷贝 拷贝对象及其子对象
见下例:
import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 e = a[:] #利用分片操作进行拷贝(浅拷贝) b = a <span style="white-space:pre"> </span>#赋值,传对象的引用 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方法一样,也是实现的浅拷贝。
原文地址:http://blog.csdn.net/lc_910927/article/details/37996003