copy模块

时间:2023-04-24 19:24:32

# -*- 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