Python — Mutable vs Immutable
今天來探討 Python 中的 Mutable 與 Immutable 的概念。Mutable 顧名思意就是「可變的」,而「Immutable」顧名思義是不可變得。
那麼什麼在 Python 中什麼是「可變的」?什麼是「不可變的」呢?我們來說得具體一點。
Python 中 Mutable 定義,
物件的「值」可以被改變。
反之,Immutable 就是物件的值不可以被改變。
聽到這邊你可能產生一些疑惑,為什麼是「物件」?什麼是「值」?可以改變和不可以被改變又是怎麼回事?
我們先來探討第一個問題,為什麼是物件。
在 Python 中的一切都是物件
Everything Is an Object by DiveIntoPython
這是什麼意思呢? 在 Python 中你所使用的一切東西都是物件。 如果你有寫過其他語言,例如:Java。你可能會產生一些疑惑。Java 中的 int 是基本型別(Primitive Data Types)。
我們來看看 Java 中的基本型別是怎麼定義的:
Primitive types are special data types built into the language; they are not objects created from a class. A literal is the source code representation of a fixed value; literals are represented directly in your code without requiring computation.
Java 中的基本型別是語言中特別的資料型別,「不是」物件。
Python 中一切皆是物件,跟 Java 剛好成為強烈的對比。我們來試試看一下 Python 中的資料型別。
使用 id(object) 可以找到物件 id。
使用 __class__ 特殊方法可以找到物件是由哪個類別(class)生成的。
由此可知,在 Python 中的基本型別也是物件。其他特殊情況,例如函式,在 Python 中也是物件,這邊講太多會有點失焦,所以我們先回到主軸。
Immutable Object
直譯「不可被改變的物件」,是什麼意思呢?
當物件生成後,值(Value)無法被改變。
例如:先將 100 指派給 a ,接著我想把 a 的值改成 101 ,我們來看看會發生什麼事情。
當 a 是 100 的時候,物件 id 是 4487734736。當我想重新指派 101 給 a 的時候,因為整數資料型別(Integer),他是一種 Immutable Object,值無法被改變。
所以,當我們指派給 101 給 a 後,a 的 id 由 4487734736 變成了 4487734768,產生了一個新的物件。
除了整數 int 以外,在 Python 中以下的型別也是 immutable 的
Mutable Object
接下來來談談「可變的物件」,那麼什麼東西是可變的呢?同理,此物件的值可以被改變。
我們用字典 ( dict) 資料型別來演示,當我們創造出一個字典資料結構的時候,裡面的內容是可以被改變的,而且外部的 id 卻不會改變。這樣的特性就跟 JS 之類的動態語言比較相似。
心得
有些語言有著類似的特性,像是 JS 、Ruby 在某些特性上也跟 Python 有著相似之處,透過學習 Python 語言特性的過程。似乎又更了解了一點以前學習的語言。