delの概要
| オブジェクトや変数の削除 Python予約語 | ||
|
del 概要 わかりやすく説明 |
||
|
delの考え方をイメージで理解

変数の削除
一度メモリ空間に定義した変数に対し del を実行すると、その変数は初めから定義されていなかった状態へと巻き戻ります。
# 変数の削除の例
user_token = "auth_xyz123"
print(user_token) # 結果: auth_xyz123
del user_token
# 💡名札が消えたため、これ以降はアクセスできません
# print(user_token) # ❌エラー: NameError: name 'user_token' is not defined
- 消去後に変数を開こうとすると、「指定された変数は定義されていません」とPythonに検知されます。
リストの要素を削除
リストのインデックス(要素の番号)を指定し、特定の格納データだけを詰めて消去します。
# リストの要素を削除
numbers = [10, 20, 30, 40]
del numbers[1] # インデックス1(2番目)の「20」をピンポイントで削除
print(numbers) # 結果: [10, 30, 40]
del numbers[1]の執行と同時に20が消滅し、後ろに並んでいた30, 40が自動的に前へと詰められてインデックスが再整列されます。
スライスで複数の要素をまとめて削除
Pythonの強力なスライス機能([開始位置:終了位置])と組み合わせることで、指定した範囲のデータを一括で根こそぎ消去可能です。
# リストのスライスを削除
dataset = [10, 20, 30, 40, 50, 60]
del dataset[1:4] # インデックス1から3まで(20, 30, 40)をまとめて一挙に消去
print(dataset) # 結果: [10, 50, 60]
- ループ文を回して1つずつ何度も消去コードを動かす必要がないため、内部的な処理負荷を大幅に抑えることができます。
辞書のキーを削除
辞書(dictオブジェクト)に対して del を適用すると、指定した検索キーと、そこに格納されている値(バリュー)をペアごと完全に消し去ります。
# 辞書のキーを削除
user_profile = {"id": 99, "role": "admin", "status": "active"}
del user_profile["role"] # キー「"role"」とその値「"admin"」をペアで削除
print(user_profile) # 結果: {"id": 99, "status": "active"}
オブジェクト(インスタンス)の削除
自分で定義したクラスから生成した立体的なオブジェクト(インスタンス)も、変数と同様の手順で明示的にメモリから解放へ向かわせることができます。
# オブジェクトの削除とデストラクタの連動
class ResourceManager:
def __del__(self):
# オブジェクトがメモリから完全に消滅する瞬間に自動起動する特殊メソッド
print("リソースマネージャーがメモリから完全に消滅しました。")
session = ResourceManager()
del session # 参照を切断。この瞬間に __del__ が呼び出されます
delの注意点
- データ本体を直接破壊する命令ではなく「名札(参照)」を引きちぎる命令(最重要の仕組み):Pythonの
delは、メモリ上にあるデータそのものを直接物理的に破壊・抹消するコマンドではありません。正体は、データに接続されている変数という名の「名札(参照)」を一本引き剥がすだけの命令です。 - 他に名札を握っている変数が1つでも残っていれば、データは消えない:オブジェクトに対して
delを行っても、別の別名変数がそのデータを指し示している場合、データ本体はメモリに残り続けます。誰からも見失われた(参照の合計数がゼロになった)状態になって初めて、Pythonの裏方である「ガベージコレクタ」の自動掃除の対象になります。# 【データが消えない罠の失敗コード】 data_a = [5, 10, 15] data_b = data_a # data_b も同じデータ空間を指す(名札が2つある状態) del data_a # 名札を1つ剥がす # data_a は消えましたが、本体のリストは依然として data_b が握っているため消滅していません print(data_b) # 結果: [5, 10, 15] - 辞書削除におけるKeyErrorのクラッシュトラップ:辞書から
delを使ってデータを消す際、その辞書の中に存在しないキーを指定してしまうと、プログラムはKeyErrorを起こして即座にクラッシュします。実務では必ず事前にキーの存在確認を挟むか、安全なpop()メソッドで代用するのが基本です。# 【クラッシュする危険な失敗コード】 info = {"name": "Alex"} del info["age"] # ❌【エラー】 KeyError: 'age' (存在しないためクラッシュ!) # 【実務で使われる安全な対策コード】 if "age" in info: del info["age"] # ⭕存在が確定している時だけdelする # 【さらにスマートな推奨対策コード】 info.pop("age", None) # ⭕キーがなくてもエラーを出さずにスルーしてくれる実務用メソッド
delのよくある質問
- Q: リストの要素を削除する道具として `del` 以外に `remove()` や `pop()` がありますが、これらは実務でどう使い分けるべきですか?
- A: 「位置(インデックス)」で消すか、「データの中身(値)」で消すかで使い分けます。 以下のように、削除するための判断材料によって明確な役割分担があります。
命令 削除の指定方法 特徴と戻り値 del items[0]インデックス(位置番号) 最も高速。値を返す必要がなく、ただ抹消したい時に使用。スライスでの一括削除も得意。 items.pop(0)インデックス(位置番号) 指定位置の要素をリストから切り離し、その消した中身を戻り値として再利用できる。 items.remove("apple")オブジェクトの値そのもの 位置が何番目か分からなくても、合致する要素の先頭を検索して自動消去する。 - Q: コードの中に `del` を書きさえすれば、PCの物理メモリは「今この瞬間に」絶対に100%解放されますか?
- A: いいえ、即座に解放されるとは限りません。
delが行う仕事は、あくまで「この変数とデータのつながりを切断しました(もう私は使いません)」という意思表示を記録する位置までです。 その結果として参照数がゼロになったデータを検知し、実際にPCの物理メモリ領域をクリーンアップして空きスペースに戻すのは、Pythonのシステムがバックグラウンドで管理している「ガベージコレクタ(GC)」というお掃除機構です。ガベージコレクタは独自の周期アルゴリズムで巡回しているため、delの実行から実際のメモリ解放までには、わずかな時間差(タイムラグ)が生じることがあります。
まとめ
del は、Pythonプログラムの内部リソースを能動的にコントロールし、メモリ空間をスッキリと健全な状態に維持するための必須キーワードです。
del 変数名の記述により、役目の終わった変数(名札)をメモリ空間から即時抹消できる。- リストの特定位置(スライス対応)や、辞書の特定のキーを指定して無駄なデータをピンポイントにくり抜ける。
- データ本体の直接破壊ではなく、データへの「接続(参照カウンタ)」を操作するシステムである点を意識する。
大量のテキストログ解析や巨大なグラフィック処理、データサイエンス分野などで、メモリ逼迫を防ぐための軽量化テクニックとして del の参照管理を正しく使いこなせるようになりましょう。