Pythonにおいて、深いコピーと浅いコピーの違いは何ですか?
Pythonには、ディープコピーとシャローコピーの2つの異なるコピー方法があります。
- 浅いコピー:
浅いコピーとは、新しいオブジェクトを作成することであるが、そのオブジェクト内の要素は元のオブジェクト内の要素の参照である。つまり、新しいオブジェクト内の要素と元のオブジェクト内の要素は同じメモリアドレスを指している。新しいオブジェクト内の要素を変更すると、元のオブジェクト内の要素も対応して変更される。Pythonでは、copy()メソッドを使用して浅いコピーを行うことができます。
import copy
a = [1, 2, [3, 4]]
b = copy.copy(a)
b[2][0] = 5
print(a) # [1, 2, [5, 4]]
- ディープコピー(Deep Copy):
ディープコピーとは、新しいオブジェクトを作成し、元のオブジェクトの要素を再帰的にコピーすることであり、新しいオブジェクトの要素と元のオブジェクトの要素が完全に独立しています。新しいオブジェクトの要素を変更しても元のオブジェクトの要素には影響を与えません。Pythonでは、deepcopy()メソッドを使用してディープコピーを行うことができます。
import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)
b[2][0] = 5
print(a) # [1, 2, [3, 4]]
一般的に言って、浅いコピーはオブジェクトの1階層の参照関係だけをコピーし、深いコピーはオブジェクトのすべての参照関係を再帰的にコピーして、全く新しいオブジェクトを作成します。深いコピーは浅いコピーよりも時間とメモリリソースを消費しますが、オブジェクト間の完全な独立性を保証します。