Pythonで辞書の深いコピーと浅いコピーの違いを理解する 初心者向け完全ガイド
生徒
「Pythonで辞書をコピーするときに『浅いコピー』とか『深いコピー』って聞くんですが、何が違うんですか?」
先生
「浅いコピーと深いコピーは、コピーした後に元のデータとどのくらい影響し合うかが違います。特にネストされた辞書ではこの違いが重要です。」
生徒
「ネストされた辞書というのは、辞書の中にさらに辞書が入っている形のことですか?」
先生
「そうです。それでは、浅いコピーと深いコピーの基本と違いを順番に見ていきましょう!」
1. 浅いコピーとは?
浅いコピーは、辞書そのものを新しく作りますが、辞書内に含まれるオブジェクト(リストや別の辞書など)はコピーせず、同じものを参照します。つまり、外側だけ複製され、内側は共有されます。
original = {"name": "Taro", "scores": [80, 90]}
shallow_copy = original.copy()
shallow_copy["scores"][0] = 100
print(original)
{'name': 'Taro', 'scores': [100, 90]}
外側の辞書は別物ですが、scoresリストは共有されているため、片方を変更するともう一方にも影響します。
2. 深いコピーとは?
深いコピーは、外側の辞書だけでなく、その中にあるリストや別の辞書も含めてすべて新しくコピーします。そのため、片方を変更してももう一方に影響しません。
import copy
original = {"name": "Taro", "scores": [80, 90]}
deep_copy = copy.deepcopy(original)
deep_copy["scores"][0] = 100
print(original)
{'name': 'Taro', 'scores': [80, 90]}
copy.deepcopy()を使うことで、内側のオブジェクトも別々に複製されます。
3. ネスト辞書での違い
辞書の中にさらに辞書が入っている「ネスト構造」では、浅いコピーと深いコピーの違いが特に分かりやすくなります。
original = {"team": {"leader": "Yamada", "members": 5}}
shallow_copy = original.copy()
shallow_copy["team"]["members"] = 10
print(original)
{'team': {'leader': 'Yamada', 'members': 10}}
浅いコピーでは内側の辞書は共有されるため、元のデータも変更されます。
import copy
deep_copy = copy.deepcopy(original)
deep_copy["team"]["members"] = 15
print(original)
{'team': {'leader': 'Yamada', 'members': 10}}
深いコピーなら、内側の辞書も別物になるため、元のデータは影響を受けません。
4. どちらを使うべきか?
- 辞書の中身が単純な場合(数値や文字列のみ) → 浅いコピーで十分
- 辞書の中にリストや別の辞書が入っている場合 → 深いコピーがおすすめ
浅いコピーの方が処理は速いですが、意図しないデータの変更が起きる可能性があります。ネスト構造やリストを含む場合は深いコピーを使うと安心です。
5. 実用例:設定データのコピー
アプリケーションの設定ファイルを扱う場合、元の設定を残しながら変更したいことがあります。浅いコピーでは内部のリストや辞書が共有されてしまうため、設定が意図せず変わる危険があります。
default_config = {
"theme": "light",
"options": {
"font_size": 12,
"show_line_numbers": True
}
}
import copy
custom_config = copy.deepcopy(default_config)
custom_config["options"]["font_size"] = 16
print(default_config)
{'theme': 'light', 'options': {'font_size': 12, 'show_line_numbers': True}}
このように、deepcopy()を使うことで安全に元の設定を保持したまま変更できます。