\

Pythonの標準ライブラリには、オブジェクトのコピーを行うためのcopyモジュールがあります。このモジュールは「シャローコピー」と「ディープコピー」の二つの主要な機能を提供しています。

シャローコピーとは?

シャローコピーは、新たな複合オブジェクトを作成し、元のオブジェクト中に見つかったオブジェクトに対する参照を挿入します。これは「参照によるコピー」とも言えます。シャローコピーは、オブジェクトの属性(メンバ変数)などをコピーするときに、この参照を使ってコピーを行います。つまり、参照の複製です。

シャローコピーは参照によるコピーなので、コピー元とコピー先のオブジェクトの属性などは両者間で共有されます。そのため一方のオブジェクトの属性の値を変更すれば、もう一方のオブジェクトの属性も変化します。

シャローコピーは実体の再帰的なコピーを行わないので、速度的にはディープコピーに勝ります。

ディープコピーとは?

ディープコピーは、新たな複合オブジェクトを作成し、その後元のオブジェクト中に見つかったオブジェクトのコピーを挿入します。つまりオブジェクトがリストなどの属性を持っていたとして、シャローコピーはそのリストのコピーには参照を使いますが、ディープコピーはリストの要素を再帰的にコピーして複製します。

ディープコピーは実体のコピーを丸ごと行うので、元のオブジェクトと複製されたオブジェクトはまったく別のメモリ上に配置されます。そのためシャローコピーのように一方のオブジェクトの属性を変更したらもう一方のオブジェクトの属性も変化した、などということは起こりません。

copy.copy()とcopy.deepcopy()の使い方

Pythonのcopyモジュールにはcopy.copy()copy.deepcopy()という二つの関数があります。copy.copy()はオブジェクトのシャローコピーを行う関数で、copy.deepcopy()はオブジェクトのディープコピーを行う関数です。

以下にそれぞれの関数の使用例を示します。

import copy

class OwnerList:
    def __init__(self):
        self.owners = ['Bob', 'Taro']

ownerlist = OwnerList()
ownerlist_2 = copy.copy(ownerlist)  # シャローコピー

ownerlist.owners.append('Hanako')  # 一方のownersを変更
print(ownerlist.owners)  # ['Bob', 'Taro', 'Hanako']
print(ownerlist_2.owners)  # ['Bob', 'Taro', 'Hanako']

ownerlist_3 = copy.deepcopy(ownerlist)  # ディープコピー
ownerlist.owners.append('Jiro')  # 一方のownersを変更
print(ownerlist.owners)  # ['Bob', 'Taro', 'Hanako', 'Jiro']
print(ownerlist_3.owners)  # ['Bob', 'Taro', 'Hanako']

このように、copyモジュールを使うことで、Pythonのオブジェクトのシャローコピーとディープコピーを簡単に行うことができます。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です