Python中的深淺複製
阿新 • • 發佈:2018-11-16
來看一段程式碼
import copy class Bus: def __init__(self,passengers=None): """ 模擬乘客上下車 """ if passengers is None: self.passengers = [] else: self.passengers = list(passengers) def pick(self,name): self.passengers.append(name) def drop(self,name): self.passengers.remove(name) bus1 = Bus(['Alice','Bill','Claire','David']) bus2 = copy.copy(bus1) # 淺複製 bus3 = copy.deepcopy(bus1) # 深複製 print(id(bus1),id(bus2),id(bus3)) bus1.drop('Bill') # 刪除掉bus1物件中的Bill後 也同時刪掉了bus2中的Bill print(bus2.passengers) print(bus1.passengers, bus2.passengers, bus3.passengers) # 深複製的內心毫無波動還想笑,對 我沒變
執行程式碼:
注意,一般來說,深複製不是件簡單的事。如果物件有迴圈引用,那麼這個樸素的演算法會進入無限迴圈。deepcopy 函式會記住已經複製的物件,因此能優雅地處理迴圈引用,如示例 8-10 所示
此外,深複製有時可能太深了。例如,物件可能會引用不該複製的外部
資源或單例值。我們可以實現特殊方法 copy() 和
deepcopy(),控制 copy 和 deepcopy 的行為,詳情參見 copy 模
塊的文件(http://docs.python.org/3/library/copy.html