Pythonでは、オブジェクトのコピーを作成するための2つの方法、深いコピーと浅いコピーが提供されています。深いコピーは、その内部のすべてのオブジェクトと共に完全なオブジェクトの新しい、独立したコピーを作成します。一方、浅いコピーは、元のオブジェクトの内容を参照する新しいオブジェクトを作成します。この区別は、あるオブジェクトへの変更がもう一方のオブジェクトにどのように影響するかに影響を与えることがあります。
本ブログ投稿では、Pythonにおける深いコピーと浅いコピーについて、リスト、辞書、文字列、整数などのオブジェクトを使用して詳しく説明します。私たちは、これら2つのコピーのタイプを実践的な例を通して比較し、堅牢なコーディング慣行におけるこれらの概念の理解の重要性を強調します。
copy
モジュールの使用Pythonは、オブジェクトの深いコピーを作成するためのdeepcopy
メソッドを含むcopy
モジュールを提供しています。
import copy
original_list = [1, [2, 3], [4, 5]]
deep_copied_list = copy.deepcopy(original_list)
deep_copied_list[1][0] = '変更されました'
print(original_list) # 出力: [1, [2, 3], [4, 5]]
上記のコードスニペットは、deepcopy
メソッドを使用して深いコピーを作成する方法を示しています。deep_copied_list
への変更はoriginal_list
に影響しません。
copy
メソッドの使用浅いコピーは、copy
モジュールのcopy
メソッドを使用するか、オブジェクトの組み込みコピーファンクショナリティを使用して作成することができます。
import copy
original_dict = {'a': [1, 2], 'b': [3, 4]}
shallow_copied_dict = copy.copy(original_dict)
shallow_copied_dict['a'][0] = '変更されました'
print(original_dict) # 出力: {'a': ['変更されました', 2], 'b': [3, 4]}
このコードスニペットは、shallow_copied_dict
への変更がoriginal_dict
に反映されることを強調しています。浅いコピーには、元のオブジェクトの内容を参照するものが含まれています。
Pythonでは、リスト、辞書、文字列、整数など、異なるタイプのオブジェクトに対して深いコピーと浅いコピーを実行することができます。これらのコピー方法の挙動は、ミュータブルとイミュータブルのタイプの間で異なります。以下に概要を示します。
import copy
original_list = [1, [2, 3], [4, 5]]
deep_copied_list = copy.deepcopy(original_list)
original_list = [1, [2, 3], [4, 5]]
shallow_copied_list = original_list.copy()
shallow_copied_list[1][0] = '変更されました'
print(original_list) # 出力: [1, ['変更されました', 3], [4, 5]]
リストについては、深いコピーは完全に独立したコピーを作成し、浅いコピーはネストしたオブジェクトの共有参照をもたらします。
import copy
original_dict = {'a': [1, 2], 'b': [3, 4]}
deep_copied_dict = copy.deepcopy(original_dict)
original_dict = {'a': [1, 2], 'b': [3, 4]}
shallow_copied_dict = original_dict.copy()
shallow_copied_dict['a'][0] = '変更されました'
print(original_dict) # 出力: {'a': ['変更されました', 2], 'b': [3, 4]}
辞書については、深いコピーは完全に新しいオブジェクトを作成し、浅いコピーはネストしたオブジェクトに対する参照をもたらします。
original_str = "text"
deep_copied_str = copy.deepcopy(original_str)
original_int = 42
deep_copied_int = copy.deepcopy(original_int)
original_str = "text"
shallow_copied_str = copy.copy(original_str)
original_int = 42
shallow_copied_int = copy.copy(original_int)
文字列と整数は不変であるため、浅いコピーと深いコピーは同じ動作をし、完全に新しいオブジェクトを作成します。
オブジェクトの型 | 深いコピー | 浅いコピー | Mutable / Immutable |
---|---|---|---|
List | 独立したコピーを生成する | 入れ子になったオブジェクトの参照が共有 | Mutable |
Dictionary | 独立したコピーを生成する | 入れ子になったオブジェクトの参照が共有 | Mutable |
String | 独立したコピーを生成する | 独立したコピーを生成する | Immutable |
Integer | 独立したコピーを生成する | 独立したコピーを生成する | Immutable |
Pythonにおいて、複雑なデータ構造と効果的に働くために、どのようにオブジェクトが複製および参照されるかを制御するコピーの挙動を理解することが重要です。より正確で効率的なコードへとつながります。
Pythonにおける複雑なデータ構造を操作するために、深いコピーと浅いコピーの違いを理解することが重要です。オブジェクトの複製および参照の方法に対する精確な制御が可能になり、より合理化され、効率的なコーディングが可能になります。
copy
モジュールからdeepcopy
メソッドを使用します。[Python] 多彩な実例を通じてビット演算子を深く理解 |
---|
[Python] 多彩な実例を通じて関係演算子を深く理解 |
[Python] 'zsh: command not found: python' エラーの解決法 |
[Python] 多彩な実例を通じて代入演算子を深く理解 |
[Python] 多彩な実例を通じて算術演算子を深く理解 |
CloneCoding
1行のコードから始まる革新!