Pythonで辞書をコピー(copy, deepcopy)
この記事では、Pythonにおける辞書のコピー方法について解説します。copyモジュールのcopy()とdeepcopy()関数の違い、そしてそれぞれの使用方法と注意点について説明します。
目次
copy() 関数による浅いコピー
copyモジュールのcopy()関数は、辞書の浅いコピーを作成します。浅いコピーとは、元の辞書とコピーされた辞書が同じオブジェクトを参照するということです。そのため、コピーされた辞書の要素を変更すると、元の辞書も変更されます。
import copy
dict1 = {'a': 1, 'b': [2, 3]}
dict2 = copy.copy(dict1)
dict2['a'] = 10
dict2['b'][0] = 20
print(f'dict1: {dict1}')
print(f'dict2: {dict2}')
上記の例では、dict2['a']を変更してもdict1['a']は影響を受けません。しかし、dict2['b'][0]を変更すると、dict1['b'][0]も変更されます。これは、リストなどの変更可能なオブジェクトは、参照によってコピーされるためです。
deepcopy() 関数による深いコピー
copyモジュールのdeepcopy()関数は、辞書の深いコピーを作成します。深いコピーとは、元の辞書とコピーされた辞書が完全に独立したオブジェクトになることです。そのため、コピーされた辞書の要素を変更しても、元の辞書は変更されません。
import copy
dict1 = {'a': 1, 'b': [2, 3]}
dict2 = copy.deepcopy(dict1)
dict2['a'] = 10
dict2['b'][0] = 20
print(f'dict1: {dict1}')
print(f'dict2: {dict2}')
deepcopy()を使うと、ネストした構造体に対しても、完全に独立したコピーが作成されます。
copy()とdeepcopy()の違い
copy()は浅いコピー、deepcopy()は深いコピーを作成します。変更可能なオブジェクト(リスト、辞書など)を扱う場合は、deepcopy()を使うことで、意図しないデータの変更を防ぐことができます。
どちらを使うべきかは、コピー対象のデータ構造と、コピー後のデータの独立性を考慮して決定する必要があります。
リストを含む辞書のコピー例
import copy
dict1 = {'a': 1, 'b': [2, 3, 4]}
dict2 = copy.copy(dict1) # 浅いコピー
dict3 = copy.deepcopy(dict1) # 深いコピー
dict2['b'][0] = 100
dict3['b'][0] = 200
print(f'dict1: {dict1}')
print(f'dict2: {dict2}')
print(f'dict3: {dict3}')
ネストした辞書のコピー例
import copy
dict1 = {'a': 1, 'b': {'c': 2, 'd': 3}}
dict2 = copy.copy(dict1) # 浅いコピー
dict3 = copy.deepcopy(dict1) # 深いコピー
dict2['b']['c'] = 100
dict3['b']['c'] = 200
print(f'dict1: {dict1}')
print(f'dict2: {dict2}')
print(f'dict3: {dict3}')
まとめ
Pythonで辞書をコピーする際は、copy()とdeepcopy()の使い分けが重要です。浅いコピーと深いコピーの違いを理解し、状況に応じて適切な関数を選択することで、バグを減らし、コードの信頼性を高めることができます。
関連記事
- Pythonでリストをコピー(copy, deepcopy)
- Pythonで辞書から要素を削除(pop, popitem, del)
- Pythonで辞書に要素を追加・更新(update, 辞書[key] = value)
- Pythonで辞書のキー・値を取得(keys, values, items)
- Pythonで辞書をループ処理(for key in dict, for key, value in dict.items())
- Pythonで辞書を結合(update, {**dict1, **dict2} (Python 3.5以降))
- Pythonで辞書をフィルタリング(辞書内包表記)
- Pythonで辞書を作成(dict, 辞書内包表記)
- Pythonで辞書をJSONに変換(json.dumps)
- PythonでJSONを辞書に変換(json.loads)