天天看點

《python 與資料挖掘 》一 3.3 可變對象與不可變對象

python的所有對象可分為可變對象和不可變對象(見表3-1)。所謂可變對象是指,對象的内容可變,而不可變對象是指對象内容不可變。

《python 與資料挖掘 》一 3.3 可變對象與不可變對象

我們在前面已經介紹過數值類型是不可變對象,當程式嘗試改變資料的值時,程式會重新生成新的資料,而不是改變原來的資料。

之是以本書要将這部分内容放到函數這一章,是因為python函數的參數都是對象的引用。如果在引用不可變對象中嘗試修改對象,程式會在函數中生成新的對象,函數外被引用的對象則不會被改變。請看下面一個函數:

執行num = 1,add1(num),然後再輸出num的值,發現num的值還是1。這是因為主程式中的num與函數中的num是不一樣的,具體一點說,它們的位址不一樣,是以改變函數中的num值時并不會改變函數外的num。如果希望改變主程式的num值,可以通過傳回值實作。

但如果參數是一個清單:

輸出l時你會發現l變成了[1,2,3],這是因為函數的參數是引用。

如果我們希望指派時可變對象不進行引用,而是重新配置設定位址空間并将資料複制,我們可以利用python的copy子產品。其中主要的函數有copy.copy和copy.deepcopy。

1)copy.copy 僅僅複制父對象,不會複制父對象内部的子對象。

2)copy.deepcopy 複制父對象和子對象。

下面給出了一個很好的例子,如代碼清單3-2所示。

代碼清單3-2 深複制與淺複制