原地修改與重新綁定的追蹤
獨立掌握檢查 — 評量作業期間不得使用 AI 輔助。若接受任何輔助必須如實申報,但接受輔助的作業只計為補救練習:在聲稱掌握之前,必須完成一次新的無輔助檢查。
前置要求
已完成 Day 04 的值與綁定檢查;能夠儲存一個簡短的 Python 檔案並在終端機中執行。
學習目標
透過預測、執行和解釋,說明為什麼 append 會改變兩個名稱共用的串列,而 a = a + [2] 只重新綁定名稱 a。
操作指引
必做:
1. 執行任何程式之前,先在草稿區寫下你對兩行輸出的預測。
2. 將練習中的程式儲存為 trace.py,然後執行 python trace.py。
3. 把實際輸出原樣抄在預測旁邊,並標出每一處不一致。
4. 針對每種情況,用一兩句話說明在該情況第三行之後 a 和 b 分別指向哪個串列物件。
選做(僅在必做證據完成之後):在每種情況之後加上 print(id(a), id(b)),確認兩個 id 只在情況 1 中相同。
自主實作與記錄
先預測輸出,然後執行:
a = [1]
b = a
a.append(2)
print("case 1:", a, b, a is b)
a = [1]
b = a
a = a + [2]
print("case 2:", a, b, a is b)
為什麼 b 在情況 1 中改變了,在情況 2 中卻沒有?
a.append(2) 修改的是兩個名稱共同指向的那個串列物件。a + [2] 會建立一個全新的串列,而 a = ... 只把名稱 a 指向它;b 仍然指向舊串列。
輸出(Python 3.13 與 3.14 完全相同):
case 1: [1, 2] [1, 2] True
case 2: [1, 2] [1] False
解析:
- 情況 1:b = a 讓兩個名稱指向同一個串列。append 原地修改這個串列,所以兩個名稱都顯示 [1, 2],a is b 為 True。
- 情況 2:a + [2] 建立了新串列 [1, 2],指派把 a 重新綁定到它。b 仍指向原來的 [1],所以 a is b 為 False。
規律:原地修改改變的是物件本身,所有指向它的名稱都看得到變化;重新綁定只改變某一個名稱指向哪個物件,其他名稱不受影響。
客觀知識測驗與診斷追蹤
請回答以下題目檢驗掌握情況。提交前請誠實聲明你的輔助條件。
依序執行 a = [1]、b = a、a = a + [2] 之後,print(b) 顯示什麼?
a + [2] 回傳一個新串列,指派只把 a 指向它。b 仍指向原串列 [1]。只有像 append 這樣的原地操作,才會透過 b 看到變化。
想一想第三行是在修改既有物件,還是在建立新物件。
作答應證與歷史記錄
在沒有 AI 輔助的情況下,記錄了執行前的預測、兩行準確的輸出,以及能區分修改共用物件(情況 1)與把一個名稱重新綁定到新物件(情況 2)的正確解釋。
權威來源資源與權利證明
Python Standard Library: Built-in Types
對應章節 / 時間戳: 相關章節:真值檢驗、比較、可變序列型別
驗證版本與日期: Python 3.12 documentation (verified 2026-10-30)
用於核對真值檢驗、比較、綁定與原地修改行為的規範性參考。
Day 03 補救練習
執行所附 Python 範例,並查閱本機已安裝直譯器的說明。
對比候選資源與選型分析 (2)
該參考深入講解物件語義,超出了運算式練習所需的深度;選擇 stdtypes 可將範圍限定在運算子層面的內容。
這是對相同運算子的敘述性入門講解;選擇函式庫參考作為正式規範的依據。
Git User Manual: Recording Changes
對應章節 / 時間戳: 「記錄對儲存庫的修改」一節
驗證版本與日期: Verified 2026-10-30
安全提交前檢查小範圍差異的第一手參考。
Git 基礎知識
在本機使用 `git diff` 與 `git status`;理解差異之前不要提交。
對比候選資源與選型分析 (2)
這是命令選項層級的參考;選擇 Pro Git 章節,是因為它逐步引導讀者在提交前檢查修改。
這是易讀的商業教學;針對同樣的修改檢查習慣,書籍章節更深入地解釋了暫存與索引語義。