# -*- coding: utf-8 -*-
# python:2.x
__author__ = 'Administrator'
#copy复制对象
#作用:提供一些函数,可以使用潜复制和深复制进行复制对象
#版本1.4及之后
#包含coy()和deepcopy()进行复制对象
#潜复制:引用
import copy
class Myclass:
def __init__(self,a):
self.name=a
def __cmp__(self,oth):
return cmp(self.name,oth.name)
print u'潜复制'
a= Myclass('a')
my_list=[a]
dup=copy.copy(my_list)
print 'my_list:',my_list
print 'dup is my_list:',dup
print 'dup == my_list:',dup==my_list
print 'dup[0] is my_list[0]:',dup[0]is my_list[0]
print 'dup[0]==my_list[0]:',dup[0]==my_list[0]
#对于一个潜复制,不会复制父类实例,所以列表中引用会指向列表中相同的对象
#深复制
print u'深复制'
dup=copy.deepcopy(my_list)
print 'my_list:',my_list
print 'dup is my_list:',dup
print 'dup == my_list:',dup==my_list
print 'dup[0] is my_list[0]:',dup[0]is my_list[0]
print 'dup[0]==my_list[0]:',dup[0]==my_list[0]
#定制复制行为
"""
可以使用特殊方法__cmp__()和__deepcopy__()来近几年如何建立副本
__copy__()不提供任何参数,返回一个潜复制
__deepcopy__()提供一个备忘<字典>返回一个深复制,所有需要深复制的成员属性都要连同备忘字典传递给__deepcopy__()来控制递归
"""
#例子
print u'特殊方法'
class MN:
def __init__(self,name):
self.name=name
def __cmp__(self, other):
return cmp(self.name,other.name)
def __copy__(self):
print '__copy__()'
return MN(self.name)#递归调用
def __deepcopy__(self,m):
print '__deepcopy__(%s)'%str(m)
return MN(copy.deepcopy(self.name,m))
a=MN('a')
c=copy.copy(a)
dc=copy.deepcopy(a)
#深复制中递归问题
#通过实例__deepcopy__()方法来防止递归
print u'其他内容'
import pprint
class Graph:
def __init__(self,name,c):
self.name=name
self.c=c
def add_connection(self,othr):
self.c.append(othr)
def __repr__(self):
return 'Graph(name=%s id=%s)'%(self.name,id(self))
def __deepcopy__(self,n):#这里的n表示字典的key
print '\ncalling_deepcopy__ for %r'%self
if self in n:
existing=n.get(self)
print ' Already copid to %r'%existing
return existing
print ' n dictonary:'
pprint.pprint(n,indent=4,width=40)
dup=Graph(copy.deepcopy(self.name,n),[])
print 'copying to new object %s'%dup
n[self]=dup
for c in self.c:
dup.add_connection(copy.deepcopy(c,n))
return dup
root=Graph('root',[])
a=Graph('a',[root])
b=Graph('b',[a,root])
root.add_connection(a)
root.add_connection(b)
dup=copy.deepcopy(root)
#更多:http://blog.csdn.net/yueguanghaidao/article/details/25613887
#这边对__deepcopy(self,n):对n进行了说明
#官方文档:https://docs.python.org/2.7/library/copy.html?highlight=copy#copy