Python — Mutable vs Immutable

Luka Huang
Starbugs Weekly 星巴哥技術專欄
4 min readAug 24, 2021

今天來探討 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 的

source: https://medium.com/@meghamohan/mutable-and-immutable-side-of-python-c2145cf72747

Mutable Object

接下來來談談「可變的物件」,那麼什麼東西是可變的呢?同理,此物件的值可以被改變。

我們用字典 ( dict) 資料型別來演示,當我們創造出一個字典資料結構的時候,裡面的內容是可以被改變的,而且外部的 id 卻不會改變。這樣的特性就跟 JS 之類的動態語言比較相似。

心得

有些語言有著類似的特性,像是 JS 、Ruby 在某些特性上也跟 Python 有著相似之處,透過學習 Python 語言特性的過程。似乎又更了解了一點以前學習的語言。

參考資料

--

--

Luka Huang
Starbugs Weekly 星巴哥技術專欄

期待世界上出現更多有意思的人,希望大家都能夠變成自己想要的樣子。