[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.00,0:00:03.00,Default,,0000,0000,0000,,目前為止我教了你們 mutation Dialogue: 0,0:00:03.00,0:00:05.00,Default,,0000,0000,0000,,修改已存在的物件 (object) Dialogue: 0,0:00:05.00,0:00:10.00,Default,,0000,0000,0000,,但是你還無法真正了解,跟處理字串有甚麼不同 Dialogue: 0,0:00:10.00,0:00:14.00,Default,,0000,0000,0000,,引入新變數,能夠讓我們真正地了解它們之間的差異 Dialogue: 0,0:00:14.00,0:00:17.00,Default,,0000,0000,0000,,回到之前的例子 Dialogue: 0,0:00:17.00,0:00:19.00,Default,,0000,0000,0000,,現在我要加入一個額外的指定陳述 Dialogue: 0,0:00:19.00,0:00:23.00,Default,,0000,0000,0000,,引入新變數 Dialogue: 0,0:00:23.00,0:00:25.00,Default,,0000,0000,0000,,假定新變數為 q Dialogue: 0,0:00:25.00,0:00:29.00,Default,,0000,0000,0000,,將 p 的值指定給 q Dialogue: 0,0:00:29.00,0:00:31.00,Default,,0000,0000,0000,,意思是 p 的值,這個列表物件 Dialogue: 0,0:00:31.00,0:00:34.00,Default,,0000,0000,0000,,q 現在指向了它 Dialogue: 0,0:00:34.00,0:00:37.00,Default,,0000,0000,0000,,重要的是,執行指定之後 Dialogue: 0,0:00:37.00,0:00:40.00,Default,,0000,0000,0000,,p 和 q 指向同一個列表 Dialogue: 0,0:00:40.00,0:00:43.00,Default,,0000,0000,0000,,假定執行指定陳述 Dialogue: 0,0:00:43.00,0:00:50.00,Default,,0000,0000,0000,,修改 q 中一個元素的值 Dialogue: 0,0:00:50.00,0:00:53.00,Default,,0000,0000,0000,,嗯,改變 q 的第 4 個元素 Dialogue: 0,0:00:53.00,0:00:55.00,Default,,0000,0000,0000,,這是 q 的第 4 個元素 Dialogue: 0,0:00:55.00,0:00:58.00,Default,,0000,0000,0000,,把值改為 Dialogue: 0,0:00:58.00,0:01:01.00,Default,,0000,0000,0000,,新的驚嘆號 Dialogue: 0,0:01:01.00,0:01:03.00,Default,,0000,0000,0000,,p 的值也同時被改變 Dialogue: 0,0:01:03.00,0:01:07.00,Default,,0000,0000,0000,,即使指定陳述沒有提及 p Dialogue: 0,0:01:07.00,0:01:11.00,Default,,0000,0000,0000,,事實上 p 和 q 指向同一個物件 Dialogue: 0,0:01:11.00,0:01:13.00,Default,,0000,0000,0000,,所以也改變了 p 的值 Dialogue: 0,0:01:13.00,0:01:15.00,Default,,0000,0000,0000,,字串則不是如此 Dialogue: 0,0:01:15.00,0:01:17.00,Default,,0000,0000,0000,,我們用字串試試看 Dialogue: 0,0:01:17.00,0:01:20.00,Default,,0000,0000,0000,,大家能否猜出,以指定來改變字串的第一個字母 Dialogue: 0,0:01:20.00,0:01:23.00,Default,,0000,0000,0000,,會出現什麼情況 Dialogue: 0,0:01:23.00,0:01:25.00,Default,,0000,0000,0000,,執行看看,會發生什麼事? Dialogue: 0,0:01:25.00,0:01:27.00,Default,,0000,0000,0000,,結果得到錯誤 (error) Dialogue: 0,0:01:27.00,0:01:30.00,Default,,0000,0000,0000,,錯誤的原因,是因為字串不是變種的 (not mutable) Dialogue: 0,0:01:30.00,0:01:32.00,Default,,0000,0000,0000,,我們不能改變字串的值 Dialogue: 0,0:01:32.00,0:01:36.00,Default,,0000,0000,0000,,error 說:不可以在字串裡做指定 Dialogue: 0,0:01:36.00,0:01:41.00,Default,,0000,0000,0000,,因為這類的物件是不可變的、不支持指定陳述 Dialogue: 0,0:01:41.00,0:01:44.00,Default,,0000,0000,0000,,變種的 (mutable) 物件和非變種 (immutable) 的物件的\N主要區別在於 Dialogue: 0,0:01:44.00,0:01:47.00,Default,,0000,0000,0000,,一旦物件是變種的 (mutable) Dialogue: 0,0:01:47.00,0:01:51.00,Default,,0000,0000,0000,,我們必須顧慮其他的變數,看看它們是否指向同一個物件 Dialogue: 0,0:01:51.00,0:01:53.00,Default,,0000,0000,0000,,我們可以改變某物件的值 Dialogue: 0,0:01:53.00,0:01:57.00,Default,,0000,0000,0000,,它影響的不僅是我們改變的這個變數 Dialogue: 0,0:01:57.00,0:02:00.00,Default,,0000,0000,0000,,還會改變其他變數的值 Dialogue: 0,0:02:00.00,0:02:02.00,Default,,0000,0000,0000,,舉個例子 Dialogue: 0,0:02:02.00,0:02:07.00,Default,,0000,0000,0000,,初始化 p 為包含字串 'Hello' 的列表 Dialogue: 0,0:02:07.00,0:02:11.00,Default,,0000,0000,0000,,現在有個陳述,引入了新變數 q Dialogue: 0,0:02:11.00,0:02:13.00,Default,,0000,0000,0000,,將 p 指定給 q Dialogue: 0,0:02:13.00,0:02:15.00,Default,,0000,0000,0000,,印出 p 和 q 的值 Dialogue: 0,0:02:15.00,0:02:19.00,Default,,0000,0000,0000,,可以看到變數 p 和 q 都包含字串 'Hello' Dialogue: 0,0:02:19.00,0:02:23.00,Default,,0000,0000,0000,,但是現在我們改變位置 0 的值 Dialogue: 0,0:02:23.00,0:02:26.00,Default,,0000,0000,0000,,做一個指定 Dialogue: 0,0:02:26.00,0:02:30.00,Default,,0000,0000,0000,,將 p 的位置 0 的值儲存為字母 'Y' Dialogue: 0,0:02:30.00,0:02:35.00,Default,,0000,0000,0000,,這改變了 p 的值 Dialogue: 0,0:02:35.00,0:02:43.00,Default,,0000,0000,0000,,但令人驚訝的是,這同時改變了 q 的值 Dialogue: 0,0:02:43.00,0:02:46.00,Default,,0000,0000,0000,,即使指定陳述完全沒有提及 q Dialogue: 0,0:02:46.00,0:02:49.00,Default,,0000,0000,0000,,q 的值發生改變是因為 Dialogue: 0,0:02:49.00,0:02:52.00,Default,,0000,0000,0000,,q 和 p 指向同個物件