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()

發現在用[]作為參數預設值的時候,相當于用一個passengers清單執行個體化這個對象,類似:
_passengers = []
bus2 = Bus(_passengers)
bus3 = Bus(_passengers)
避免的方式也很簡單,直接在__init__時傳入參數的副本即可。類似:
class Bus:
def __init__(self, passengers):
self.passengers = list(passengers)
(待續)