Pythonで辞書をディープコピーするには、copyモジュールのdeepcopy()を使うのが標準的な方法です。通常のcopy()は浅いコピーしか行わないため、元の辞書と新しい辞書の内部要素がリンクされてしまいます。deepcopy()を使えば、ネストされたデータ構造も完全にコピーされ、元のオブジェクトに影響を与えません。

import copy
my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
my_copy = copy.deepcopy(my_dict)

この方法で、元の辞書を変更してもコピーに影響が及びません。

deepcopy()と通常のコピーの違い

浅いコピー(copy())では、ネストされたリストや辞書の参照が共有されます。これに対してdeepcopy()は、内部のリストや辞書も完全に独立したコピーを作成します。

import copy
my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
shallow_copy = my_dict.copy()
deep_copy = copy.deepcopy(my_dict)
# 元の辞書を変更
my_dict['a'][0] = 99
# 浅いコピーには変更が反映される
print(shallow_copy['a'])  # 出力: [99, 2, 3]
# ディープコピーには影響なし
print(deep_copy['a'])  # 出力: [1, 2, 3]

スレッドセーフな代替案

copy.deepcopy()はスレッドセーフではない可能性があるため、シリアライズ可能なデータ構造の場合、jsonを使った方法が有効です。

import json
my_copy = json.loads(json.dumps(my_dict))

ただし、この方法はdict内のデータがJSONシリアライズ可能な場合に限られます。例えば、datetimeやカスタムオブジェクトには対応していません。

まとめ

辞書をディープコピーするには、copy.deepcopy()が標準的であり、ネストされたデータも含めて完全なコピーが作成されます。また、JSONベースの方法はスレッドセーフな環境で有効ですが、シリアライズ可能なデータに限られます。