Tip:
Highlight text to annotate it
X
目前為止我教了你們 mutation
修改已存在的物件 (object)
但是你還無法真正了解,跟處理字串有甚麼不同
引入新變數,能夠讓我們真正地了解它們之間的差異
回到之前的例子
現在我要加入一個額外的指定陳述
引入新變數
假定新變數為 q
將 p 的值指定給 q
意思是 p 的值,這個列表物件
q 現在指向了它
重要的是,執行指定之後
p 和 q 指向同一個列表
假定執行指定陳述
修改 q 中一個元素的值
嗯,改變 q 的第 4 個元素
這是 q 的第 4 個元素
把值改為
新的驚嘆號
p 的值也同時被改變
即使指定陳述沒有提及 p
事實上 p 和 q 指向同一個物件
所以也改變了 p 的值
字串則不是如此
我們用字串試試看
大家能否猜出,以指定來改變字串的第一個字母
會出現什麼情況
執行看看,會發生什麼事?
結果得到錯誤 (error)
錯誤的原因,是因為字串不是變種的 (not mutable)
我們不能改變字串的值
error 說:不可以在字串裡做指定
因為這類的物件是不可變的、不支持指定陳述
變種的 (mutable) 物件和非變種 (immutable) 的物件的 主要區別在於
一旦物件是變種的 (mutable)
我們必須顧慮其他的變數,看看它們是否指向同一個物件
我們可以改變某物件的值
它影響的不僅是我們改變的這個變數
還會改變其他變數的值
舉個例子
初始化 p 為包含字串 'Hello' 的列表
現在有個陳述,引入了新變數 q
將 p 指定給 q
印出 p 和 q 的值
可以看到變數 p 和 q 都包含字串 'Hello'
但是現在我們改變位置 0 的值
做一個指定
將 p 的位置 0 的值儲存為字母 'Y'
這改變了 p 的值
但令人驚訝的是,這同時改變了 q 的值
即使指定陳述完全沒有提及 q
q 的值發生改變是因為
q 和 p 指向同個物件