dict.clear() 將字典就地清空,移除所有鍵值對,保留字典物件身分。不同於重新賦值 d = {} (建立新物件),clear() 影響所有指向該字典的引用。
d.clear()
# 參數:無
# 回傳:None
# 效能:O(1) (CPython 實現只重置內部表格)
# 行為:就地修改,所有引用可見變化
d = {'Name': 'Zara', 'Age': 7}
print(f'清空前長度: {len(d)}') # 2
d.clear()
print(f'清空後長度: {len(d)}') # 0
print(d) # {}
# 情境:多變數指向同一字典
original = {'a': 1}
ref1 = original
ref2 = original
# 使用 clear()
original.clear()
print(ref1) # {} 受影響!
print(ref2) # {} 受影響!
# 重新賦值
original = {'a': 1}
ref1 = original
ref2 = original
original = {} # 建立新字典,original 指向新物件
print(ref1) # {'a': 1} 不受影響!
print(ref2) # {'a': 1} 不受影響!
| 場景 | 推薦 | 理由 |
|---|---|---|
| 需通知所有持有者字典已空 | clear() | 共享狀態同步 |
| 區域變數、無外部引用 | d = {} | 簡潔、語意明確 |
| 函數參數清空呼叫端字典 | clear() | 副作用可見 |
| 類別屬性重置 | clear() | 影響所有實例/子類 |
class ObservableDict(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.observers = []
def clear(self):
super().clear()
self._notify('cleared')
def _notify(self, event):
for cb in self.observers:
cb(self, event)
# 使用
od = ObservableDict(a=1, b=2)
od.observers.append(lambda d, e: print(f'字典{e}: {d}'))
od.clear() # 觸發通知
| 方法 | 行為 | 回傳值 | 影響引用 |
|---|---|---|---|
clear() | 移除所有項目 | None | 是 |
pop(k) | 移除指定鍵 | 值 | 是 |
popitem() | 移除任一項 (LIFO) | (k, v) | 是 |
d = {} | 建立新字典 | 新物件 | 否 (僅重綁定) |
理解 clear() 的就地語意,能正確處理共享狀態場景,避免「以為清空了但引用還有舊資料」的 Bug。