天天看點

python 深淺拷貝及實踐

python 的深淺拷貝以及一些應用場景。

深拷貝:拷貝對象的内容。

淺拷貝:拷貝對象的引用。相當于拷貝對象的引用。

(個人并不喜歡用盒子,标簽等概念來差別,用一個概念大緻解釋另一個概念有時會加深了解的難度。。。)

一些例子

可變類型作為函數參數

python中的可變類型:list,dict,set

不可變類型:number,string,tuple

我們應該避免使用可變類型作為函數參數的預設值。

一個例子(來自fluent python):

class Bus:
    def __init__(self, passengers=[]):
        self.passengers = passengers
            
    def drop(self, name):
        self.passengers.remove(name)
        
    def pick(self, name):
        self.passengers.append(name)
        
import copy

bus1 = Bus(['a', 'b'])

bus1.pick('c')
bus2 = Bus()
bus2.pick('c')
bus3 = Bus()
           
python 深淺拷貝及實踐

發現在用[]作為參數預設值的時候,相當于用一個passengers清單執行個體化這個對象,類似:

_passengers = []
bus2 = Bus(_passengers)
bus3 = Bus(_passengers)
           

避免的方式也很簡單,直接在__init__時傳入參數的副本即可。類似:

class Bus:
    def __init__(self, passengers):
        self.passengers = list(passengers)
           

(待續)