Python标准库参考笔记-copy
9.17 copy
地址:http://docs.python.org/library/copy.html
# -*- coding: cp936 -*-
import copy
print '------------------------------------copy example------------------------------------'
a = [1,2,3,4]
b = [a,a]
c = copy.copy(b)
#b中有对a的引用、c是b的拷贝
print '---------------------------------------------------------------------The initial state:'
print 'a:',a
print 'b:',b
print 'c:',c
a.append(0)
print '------------------------------------------After we append a zero to the list a:'
print 'a:',a
print 'b:',b
print 'c:',c
#------------------------------------------
print '-------------------------------deepcopy example---------------------------------'
a = [1,2,3,4]
b = [a,a]
c = copy.deepcopy(b)
print '---------------------------------------------------------------------The initial state:'
print 'a:',a
print 'b:',b
print 'c:',c
a.append(0)
print '------------------------------------------After we append a zero to the list a:'
print 'a:',a
print 'b:',b
print 'c:',c
执行结果:
------------------------------------copy example------------------------------------
---------------------------------------------------------------------The initial state:
a: [1, 2, 3, 4]
b: [[1, 2, 3, 4], [1, 2, 3, 4]]
c: [[1, 2, 3, 4], [1, 2, 3, 4]]
------------------------------------------After we append a zero to the list a:
a: [1, 2, 3, 4, 0]
b: [[1, 2, 3, 4, 0], [1, 2, 3, 4, 0]]
c: [[1, 2, 3, 4, 0], [1, 2, 3, 4, 0]]
-------------------------------deepcopy example---------------------------------
---------------------------------------------------------------------The initial state:
a: [1, 2, 3, 4]
b: [[1, 2, 3, 4], [1, 2, 3, 4]]
c: [[1, 2, 3, 4], [1, 2, 3, 4]]
------------------------------------------After we append a zero to the list a:
a: [1, 2, 3, 4, 0]
b: [[1, 2, 3, 4, 0], [1, 2, 3, 4, 0]]
c: [[1, 2, 3, 4], [1, 2, 3, 4]]
在copy的时候,c仍然保持了对a的引用。也就是说,copy在复制原对象的时候会复制它的引用,此时被引用的对象一旦被修改,则新拷贝也会受到影响。
在deepcopy的时候,c不再保持对a的引用。deepcopy复制原对象的时候会对其引用的对象也进行拷贝,而不是简单的将引用复制过来。这样,对被引用对象做出修改并不会造成新的拷贝也被修改。
PyMOTW:
http://www.doughellmann.com/PyMOTW/copy/index.html
介绍了如何使用__copy__和__deepcopy__来控制如何复制行为。