PYTHON MEBY

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()の使い分けが重要です。浅いコピーと深いコピーの違いを理解し、状況に応じて適切な関数を選択することで、バグを減らし、コードの信頼性を高めることができます。

関連記事