国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

每日一“酷”之copy

2019-11-14 17:33:50
字體:
來源:轉載
供稿:網友

Copy – 復制對象

作用:提供一些函數,可以使用淺副本或深副本語義復制對象。

copy模塊包括兩個函數copy()和deepcopy(),用于復制現有的對象

1、  淺副本

copy()創建的淺副本(shallow copy)是一個新容器,其中填充原對象內容的引用。建立list對象的一個淺副本時,會構造一個新的list,并將原對象的元素追加到這個list。

 1 import copy 2  3 class MyClass(object): 4     def __init__(self,name): 5         self.name = name 6     def __cmp__(self,other): 7         return cmp(self.name,other.name) 8   9 a = MyClass('a')10 my_lt = [a]11 dup = copy.copy(my_lt) 12 PRint '             my_lt:',my_lt13 print '               dup:',dup14 print '      dup is my_lt:',(dup is my_lt)15 print '      dup == my_lt:',(dup == my_lt)16 print 'dup[0] is my_lt[0]:',(dup[0] is my_lt[0])17 print 'dup[0] == my_lt[0]:',(dup[0] == my_lt[0])

運行結果:

__cmp__() 在比較類實例時被調用

對于一個淺副本,不會復制Myclass實例,所以dup列表中的引用會指向my_lt中相同的對象

2、  深副本

deepcopy()創建的深副本是一個新的容器,其中填充源對象內容的副本.要建立一個list的深副本,會構成一個新的list,復制原列表的元素,然后將這些副本追加到新列表。

 1 import copy 2  3 class MyClass(object): 4     def __init__(self,name): 5         self.name = name 6     def __cmp__(self,other): 7         return cmp(self.name,other.name) 8   9 a = MyClass('a')10 my_lt = [a]11 dup = copy.deepcopy(my_lt) 12 print '             my_lt:',my_lt13 print '               dup:',dup14 print '      dup is my_lt:',(dup is my_lt)15 print '      dup == my_lt:',(dup == my_lt)16 print 'dup[0] is my_lt[0]:',(dup[0] is my_lt[0])17 print 'dup[0] == my_lt[0]:',(dup[0] == my_lt[0])

運行結果:
  

3、  定制復制行為

可以使用特殊方法__copy__() 和__deepcopy__()來控制如何建立副本。

·調用__copy__()而不提供任何參數,這會返回對象的一個淺副本。

·調用__deepcopy__(),并提供一個北方字典,這回返回對象的一個深副本。所有需要深復制的成員屬性都要連同備忘字典傳遞到copy.deepcopy()來控制遞歸。

例如:

 

 1 import copy 2  3 class MyClass(object): 4     def __init__(self,name): 5         self.name = name 6     def __cmp__(self,other): 7         return cmp(self.name,other.name) 8     def __copy__(self): 9         print '__copy__()'10         return MyClass(self.name)11     def __deepcopy__(self,memo):12         print '__deepcopy__(%s)' % str(memo)13         return MyClass(copy.deepcopy(self.name, memo,))14 15 a = MyClass('a')16 sc = copy.copy(a)17 dc = copy.deepcopy(a)

運行結果:

  

備忘字典用于跟蹤已復制的值,以避免無限遞歸

4、  深副本中的遞歸

為了避免復制遞歸數據結構可能帶來的問題,deepcopy()使用一個字典來跟蹤已復制的對象。將這個歌字典傳入__deepcopy__() 方法,從而在該方法中也可以進行檢查。

下面的例子顯示了一個互連的數據結構(如圖1)可以通過實現__deepcopy__()方法幫助防止遞歸。

                     圖1

 1 class Graph(object): 2      3     def __init__(self,name,connections): 4         self.name = name 5         self.connections = connections 6     def add_connections(self,other): 7         self.connections.append(other) 8      9     def __repr__(self):10         return 'Graph(name=%s,id=%s)' % (self.name,id(self))11     def __deepcopy__(self,memo):12         print '/nCalling __deepcopy__ for %r' % self13         if self in memo:14             existing = memo.get(self)15             print '   Already copied to %r' % existing16             return existing17         print '   Memo dictionary'18         pprint.pprint(memo,indent=4,width=40)19         dup = Graph(copy.deepcopy(self.name, memo),[])20         print '   Copying to new object %s' % dup21         memo[self] = dup22         for c in self.connections:23             dup.add_connections(copy.deepcopy(c, memo))24         return dup25 26 root = Graph('root',[])27 a = Graph('a',[root])28 b = Graph('b',[a,root])29 root.add_connections(a)30 root.add_connections(b)31 32 dup = copy.deepcopy(root)

 

  Graph類包含一些基本的有向圖方法。基于一個名和已連接的現有節點的一個列表可以初始化一個Graph實例。add_connection()方法用于建立雙向諒解deepcopy也用到了這個方法__deepcopy__()方法將打印消息來顯示它如何得到調用,

并根據需要管理備忘錄字典內容。它不是復制整個鏈接列表,而是創建一個新的列表,把各個連接的副本追加到這個列表。這樣可以確保復制各個新節點時會更新備忘錄字典,以免遞歸問題或多余的節點副本。與前面一樣,完成時會返回復制的對象。

           如圖1 中存在幾個環,不過利用備忘錄字典處理遞歸就可以避免遍歷導致棧溢出錯誤。復制根節點root時,輸入如下:

     

           第二次遇到root節點時,此時正在復制a節點,__deepcopy__()檢測到遞歸,會重用備忘錄字典中現有的值,而不是創建一個新對象。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 酒泉市| 通辽市| 达日县| 沂水县| 洪湖市| 惠州市| 灵山县| 乌鲁木齐市| 汨罗市| 乳山市| 德昌县| 洪江市| 宁远县| 湄潭县| 怀来县| 务川| 永清县| 长阳| 琼结县| 岑巩县| 定远县| 平顶山市| 永吉县| 桐庐县| 桃江县| 宜昌市| 郧西县| 进贤县| 茌平县| 北碚区| 海兴县| 库伦旗| 阿拉尔市| 新乡市| 荆州市| 灵丘县| 嘉峪关市| 晴隆县| 平原县| 自贡市| 沾化县|