1 00:00:00,000 --> 00:00:03,000 目前為止我教了你們 mutation 2 00:00:03,000 --> 00:00:05,000 修改已存在的物件 (object) 3 00:00:05,000 --> 00:00:10,000 但是你還無法真正了解,跟處理字串有甚麼不同 4 00:00:10,000 --> 00:00:14,000 引入新變數,能夠讓我們真正地了解它們之間的差異 5 00:00:14,000 --> 00:00:17,000 回到之前的例子 6 00:00:17,000 --> 00:00:19,000 現在我要加入一個額外的指定陳述 7 00:00:19,000 --> 00:00:23,000 引入新變數 8 00:00:23,000 --> 00:00:25,000 假定新變數為 q 9 00:00:25,000 --> 00:00:29,000 將 p 的值指定給 q 10 00:00:29,000 --> 00:00:31,000 意思是 p 的值,這個列表物件 11 00:00:31,000 --> 00:00:34,000 q 現在指向了它 12 00:00:34,000 --> 00:00:37,000 重要的是,執行指定之後 13 00:00:37,000 --> 00:00:40,000 p 和 q 指向同一個列表 14 00:00:40,000 --> 00:00:43,000 假定執行指定陳述 15 00:00:43,000 --> 00:00:50,000 修改 q 中一個元素的值 16 00:00:50,000 --> 00:00:53,000 嗯,改變 q 的第 4 個元素 17 00:00:53,000 --> 00:00:55,000 這是 q 的第 4 個元素 18 00:00:55,000 --> 00:00:58,000 把值改為 19 00:00:58,000 --> 00:01:01,000 新的驚嘆號 20 00:01:01,000 --> 00:01:03,000 p 的值也同時被改變 21 00:01:03,000 --> 00:01:07,000 即使指定陳述沒有提及 p 22 00:01:07,000 --> 00:01:11,000 事實上 p 和 q 指向同一個物件 23 00:01:11,000 --> 00:01:13,000 所以也改變了 p 的值 24 00:01:13,000 --> 00:01:15,000 字串則不是如此 25 00:01:15,000 --> 00:01:17,000 我們用字串試試看 26 00:01:17,000 --> 00:01:20,000 大家能否猜出,以指定來改變字串的第一個字母 27 00:01:20,000 --> 00:01:23,000 會出現什麼情況 28 00:01:23,000 --> 00:01:25,000 執行看看,會發生什麼事? 29 00:01:25,000 --> 00:01:27,000 結果得到錯誤 (error) 30 00:01:27,000 --> 00:01:30,000 錯誤的原因,是因為字串不是變種的 (not mutable) 31 00:01:30,000 --> 00:01:32,000 我們不能改變字串的值 32 00:01:32,000 --> 00:01:36,000 error 說:不可以在字串裡做指定 33 00:01:36,000 --> 00:01:41,000 因為這類的物件是不可變的、不支持指定陳述 34 00:01:41,000 --> 00:01:44,000 變種的 (mutable) 物件和非變種 (immutable) 的物件的 主要區別在於 35 00:01:44,000 --> 00:01:47,000 一旦物件是變種的 (mutable) 36 00:01:47,000 --> 00:01:51,000 我們必須顧慮其他的變數,看看它們是否指向同一個物件 37 00:01:51,000 --> 00:01:53,000 我們可以改變某物件的值 38 00:01:53,000 --> 00:01:57,000 它影響的不僅是我們改變的這個變數 39 00:01:57,000 --> 00:02:00,000 還會改變其他變數的值 40 00:02:00,000 --> 00:02:02,000 舉個例子 41 00:02:02,000 --> 00:02:07,000 初始化 p 為包含字串 'Hello' 的列表 42 00:02:07,000 --> 00:02:11,000 現在有個陳述,引入了新變數 q 43 00:02:11,000 --> 00:02:13,000 將 p 指定給 q 44 00:02:13,000 --> 00:02:15,000 印出 p 和 q 的值 45 00:02:15,000 --> 00:02:19,000 可以看到變數 p 和 q 都包含字串 'Hello' 46 00:02:19,000 --> 00:02:23,000 但是現在我們改變位置 0 的值 47 00:02:23,000 --> 00:02:26,000 做一個指定 48 00:02:26,000 --> 00:02:30,000 將 p 的位置 0 的值儲存為字母 'Y' 49 00:02:30,000 --> 00:02:35,000 這改變了 p 的值 50 00:02:35,000 --> 00:02:43,000 但令人驚訝的是,這同時改變了 q 的值 51 00:02:43,000 --> 00:02:46,000 即使指定陳述完全沒有提及 q 52 00:02:46,000 --> 00:02:49,000 q 的值發生改變是因為 53 00:02:49,000 --> 00:02:52,000 q 和 p 指向同個物件