list.pop([index]) 是列表移除並回傳元素的核心方法。不同於 remove(按值刪除)、del(不回傳),pop 同時完成「取出」與「刪除」,是實作堆疊、佇列、輪詢的關鍵。
語法與參數
lst.pop() # 移除並回傳最後一個元素 (index=-1)
lst.pop(index) # 移除並回傳指定索引元素
# 回傳:被移除的元素值
# 例外:IndexError (索引超出範圍)
基本範例
a = [123, 'xyz', 'zara', 'abc']
print(a.pop()) # 'abc',列表變 [123, 'xyz', 'zara']
print(a.pop(2)) # 'zara',列表變 [123, 'xyz']
print(a.pop(-1)) # 'xyz',列表變 [123]
print(a.pop(0)) # 123,列表變 []
# a.pop() # IndexError: pop from empty list
負索引行為詳解
| 索引 | 相當於 | 移除位置 |
-1 | len-1 | 最後一個 |
-2 | len-2 | 倒數第二個 |
-len | 0 | 第一個 |
pop(-1) 是堆疊 (LIFO) 操作,pop(0) 是佇列 (FIFO) 出隊(但 O(n) 效能差)。
效能特性
pop() / pop(-1):O(1),尾部操作無位移
pop(0) / pop(i):O(n),需位移後續所有元素
- 頻繁頭部彈出請用
collections.deque (popleft() O(1))
常見實戰模式
1. 堆疊(後進先出)
stack = []
stack.append(1)
stack.append(2)
stack.append(3)
while stack:
print(stack.pop()) # 3, 2, 1
2. 處理巢狀結構(如 AST、DOM 走訪)
def dfs(root):
stack = [root]
while stack:
node = stack.pop() # 取出並移除
process(node)
stack.extend(reversed(node.children)) # 反轉保持左到右
3. 安全彈出:預設值模式
def safe_pop(lst, index=-1, default=None):
try:
return lst.pop(index)
except IndexError:
return default
# 或使用切片不修改原列表
last = lst[-1] if lst else None
4. 交換兩列表元素
a = [1, 2, 3]
b = [4, 5]
a.append(b.pop()) # a=[1,2,3,5], b=[4]
pop vs remove vs del 對照
| 方法 | 依據 | 回傳值 | 修改原列表 | 例外 |
pop(i) | 索引 | 元素值 | 是 | IndexError |
remove(x) | 值 | None | 是 | ValueError |
del lst[i] | 索引/切片 | None | 是 | IndexError |
善用 pop 的回傳值特性,能寫出簡潔高效的資料結構操作程式碼。
- 上一篇文章: Python 字元與代碼點互轉完全指南:ord、chr、unichr、ASCII 與 Unicode 邊界詳解
- 下一篇文章: Python 判斷物件是否為字串類型:isinstance、鴨子類型、UserString 與 EAFP 風格完整解析
Copyright ©
程式碼之家 All Rights Reserved