1. 程式人生 > >Python中的深淺複製

Python中的深淺複製

來看一段程式碼

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