Python List 串列:append、pop、extend 方法全攻略

Python List 串列是最常用的資料結構之一,支援動態增刪、順序儲存,讓程式靈活處理多筆資料。本文聚焦三大核心方法:append 新增單一項目、pop 移除並回傳項目、extend 合併序列,搭配規則表格、防呆指南與進階實戰,幫你徹底掌握 Python List 串列操作。

Cinematic Python list visualization showing glowing brackets with items being appended, popped, and extended, deep blue and amber tones, floating code fragments, cinematic lighting, deep shadows, 16:9

什麼是 List 串列?

List 串列是 Python 內建的有序、可變序列,用方括號 [] 建立,可儲存任意型別(整數、字串、甚至另一個串列)。與 Tuple 不同,List 建立後隨時可修改,是處理動態資料的核心工具。

你可以把 List 想像成一條可伸縮的傳送帶:append 負責把貨物推上傳送帶尾端,pop 負責從任意位置取下貨物,extend 則把另一條傳送帶整個銜接上來。三者搭配,讓資料流動自如,是 Python 程式設計中最頻繁使用的操作組合。

核心語法:三大方法實戰

# === append:在串列尾端新增單一項目 ===
fruits = ['蘋果', '香蕉']
fruits.append('橘子')       # 把 '橘子' 加到最後
print(fruits)               # ['蘋果', '香蕉', '橘子']

# append 可加入任意型別,包括整個串列(會變成巢狀)
fruits.append([1, 2])       # 把 [1,2] 當作單一項目加入
print(fruits)               # ['蘋果', '香蕉', '橘子', [1, 2]]
append 每次只接受一個引數,且永遠加在最後一個位置,時間複雜度 O(1),極其高效。
# === pop:移除並回傳指定位置的項目 ===
scores = [85, 92, 78, 95]

last = scores.pop()         # 不指定 index → 預設移除最後一個(95)
print(last)                 # 95
print(scores)               # [85, 92, 78]

first = scores.pop(0)       # 指定 index=0 → 移除第一個(85)
print(first)                # 85
print(scores)               # [92, 78]
pop 不只刪除,還會把被移除的值「回傳」給你,可用變數接住,這是 remove() 做不到的。
# === extend:將另一個可迭代序列合併到串列尾端 ===
team_a = ['Alice', 'Bob']
team_b = ['Carol', 'Dave']

team_a.extend(team_b)       # 把 team_b 所有元素逐一加入 team_a
print(team_a)               # ['Alice', 'Bob', 'Carol', 'Dave']

# extend 也接受 tuple 或字串
team_a.extend(('Eve', 'Frank'))
print(team_a)               # ['Alice', 'Bob', 'Carol', 'Dave', 'Eve', 'Frank']
extend vs appendappend(['Carol','Dave']) 會產生巢狀串列 [..., ['Carol','Dave']]extend(['Carol','Dave']) 則是逐一拆開加入,結果是扁平串列。

規則與注意事項

規則 正確範例 錯誤範例
append 只能傳入一個引數 lst.append('a') lst.append('a', 'b') → TypeError
pop 不可對空串列使用 if lst: lst.pop() [].pop() → IndexError
pop(index) 索引不可超界 lst.pop(len(lst)-1) lst.pop(999) → IndexError
extend 需傳入可迭代物件 lst.extend([1, 2]) lst.extend(5) → TypeError
三個方法皆為原地操作,無回傳值(pop 除外) lst.append('x')(直接修改原串列) new = lst.append('x') → new 為 None

常見錯誤與防呆

錯誤一:誤以為 append / extend 有回傳值

# ❌ 錯誤寫法(new_list 會是 None,因為 append 無回傳值)
new_list = my_list.append('香蕉')
print(new_list)   # None

# ✅ 正確寫法:直接操作原串列
my_list.append('香蕉')
print(my_list)    # 原串列已被修改

錯誤二:用 append 加多個項目(應改用 extend)

# ❌ 錯誤寫法(TypeError: append() takes exactly one argument)
my_list.append('a', 'b', 'c')

# ✅ 正確寫法(一次加入多個項目用 extend)
my_list.extend(['a', 'b', 'c'])

錯誤三:對空串列使用 pop 導致崩潰

# ❌ 錯誤寫法(IndexError: pop from empty list)
result = [].pop()

# ✅ 正確寫法:先確認串列不為空
queue = []
if queue:
    result = queue.pop(0)
else:
    print('串列是空的,無法 pop')

進階用法

模擬佇列(Queue):先進先出

append 在尾端入列,pop(0) 從頭部出列,實作先進先出(FIFO)邏輯,適合處理請求排程或訂單系統。

# 模擬顧客服務佇列(先來先服務)
queue = []
queue.append('顧客A')       # 顧客依序入列
queue.append('顧客B')
queue.append('顧客C')

while queue:
    current = queue.pop(0)  # 從頭部取出(先進先出)
    print(f'正在服務:{current}')

# 輸出:
# 正在服務:顧客A
# 正在服務:顧客B
# 正在服務:顧客C

模擬堆疊(Stack):後進先出

append 壓入元素,pop()(不指定索引)從頂端彈出,實作後進先出(LIFO),常用於瀏覽器上一頁、復原(Undo)功能。

# 模擬瀏覽器上一頁功能
history = []
history.append('Google')
history.append('離火煉金坊')
history.append('GitHub')

# 按下「上一頁」
prev_page = history.pop()   # 移除最後瀏覽(GitHub)
print(f'返回到:{prev_page}')   # 返回到:GitHub
print(f'目前頁面:{history[-1]}') # 目前頁面:離火煉金坊

批量資料彙整:extend 合併多來源

量化交易或資料分析時,常需把多段時間的資料合併,用 extend 比反覆 append 更簡潔,也比 + 運算子省記憶體(不建立新串列)。

# 合併多日 K 線收盤價
all_prices = []
day1_prices = [150.2, 151.5, 149.8]
day2_prices = [152.0, 153.3, 151.1]
day3_prices = [148.9, 150.0, 152.5]

for daily in [day1_prices, day2_prices, day3_prices]:
    all_prices.extend(daily)   # 逐日合併,保持扁平結構

print(f'共 {len(all_prices)} 筆資料')  # 共 9 筆資料
print(f'最高價:{max(all_prices)}')    # 最高價:153.3

煉金坊小叮嚀

學串列方法,最容易卡在「以為 append 有回傳值」這個坑,我自己剛學時也踩過!口訣:append 單一、extend 批量、pop 取走並回傳,三句話反覆念熟就不會混淆。另外提醒一點:頻繁 pop(0) 其實效率不高(O(n) 時間),若真的需要高效佇列,可改用 collections.deque先把基礎打紮實,進階優化才有意義——這是煉金的順序,也是修煉的道理。

張貼留言

較新的 較舊