Python Copy関数の使い方と実用的な活用方法

Pythonには、オブジェクトをコピーするためのcopy関数があります。この記事では、copy関数の基本的な使い方から注意点、活用例、そしてdeepcopy関数との違いまでを解説します。

copy関数について

copy関数は、オブジェクトをコピーするための関数です。コピーされたオブジェクトは、元のオブジェクトとは別のものとして扱われます。

copy関数の基本的な使い方

copy関数は、以下のように使用します。

x = [1, 2, 3]
y = x.copy()
print(y) # [1, 2, 3]

上記の例では、xというリストをコピーして、yという別のリストを作成しています。copy関数は、xとyが別々のオブジェクトとして扱われるため、xを変更してもyには影響がありません。

copy関数を使用する際の注意点

copy関数を使用する際には、注意点があります。

1. copy関数は、浅いコピーを行うため、リストの要素がオブジェクトの場合には、そのオブジェクトの参照がコピーされます。

x = [1, 2, [3, 4]]
y = x.copy()
x[2][0] = 0
print(y) # [1, 2, [0, 4]]

上記の例では、xというリストをコピーして、yという別のリストを作成しています。しかし、xの3番目の要素である[3, 4]は、オブジェクトであるため、その参照がコピーされます。そのため、x[2][0] = 0を実行すると、yにも影響が及びます。

2. copy関数は、タプルや辞書、集合などのコレクション型にも使用できます。

x = {"a": 1, "b": 2}
y = x.copy()
x["a"] = 0
print(y) # {"a": 1, "b": 2}

上記の例では、辞書型のxをコピーして、yという別の辞書を作成しています。xの”a”の値を変更しても、yには影響がありません。

copy関数の活用例

copy関数は、以下のような場面で活用されます。

1. 変数の値を保持したまま、別の変数に値を代入する場合。

x = [1, 2, 3]
y = x.copy()
x[0] = 0
print(y) # [1, 2, 3]

上記の例では、xというリストをコピーして、yという別のリストを作成しています。xの0番目の要素を変更しても、yには影響がありません。

2. オブジェクトを変更せずに、別のオブジェクトに対して同じ操作を行いたい場合。

x = [1, 2, 3]
y = [i * 2 for i in x]
print(y) # [2, 4, 6]

上記の例では、xというリストをコピーして、yという別のリストを作成しています。xの要素を2倍して、yに代入しています。

copy関数とdeepcopy関数の違い

copy関数とdeepcopy関数は、オブジェクトのコピーを行うための関数ですが、copy関数が浅いコピーを行うのに対して、deepcopy関数は深いコピーを行います。

深いコピーとは、オブジェクトの参照がコピーされるのではなく、オブジェクト自体がコピーされることを指します。

以下の例を見てみましょう。

import copy
x = [1, 2, [3, 4]]
y = copy.deepcopy(x)
x[2][0] = 0
print(y) # [1, 2, [3, 4]]

上記の例では、deepcopy関数を使用して、xというリストをコピーして、yという別のリストを作成しています。xの3番目の要素である[3, 4]は、オブジェクトであるため、そのオブジェクト自体がコピーされます。そのため、x[2][0] = 0を実行しても、yには影響がありません。

copy関数を用いた実用的なコードの例示

copy関数を用いた実用的なコードの例として、以下のようなものがあります。

1. リストのソートにおける安定性の確保

リストのソートには、sort関数が使用されます。sort関数は、デフォルトでは安定ソートではありません。しかし、copy関数を使用して、ソート前のリストをコピーしてからソートすることで、安定ソートを実現することができます。

x = [(1, "a"), (2, "b"), (1, "c")]
y = x.copy()
y.sort()
print(y) # [(1, 'a'), (1, 'c'), (2, 'b')]

上記の例では、リストxをコピーして、yという別のリストを作成しています。yに対してsort関数を実行することで、安定ソートを実現しています。

2. リストの要素をランダムに並び替える

ランダムにリストの要素を並び替えるには、randomモジュールのshuffle関数が使用されます。しかし、shuffle関数は、元のリストを変更してしまいます。そのため、copy関数を使用して、コピーしたリストに対してshuffle関数を実行することで、元のリストを保持したままランダムに並び替えることができます。

import random
x = [1, 2, 3, 4, 5]
y = x.copy()
random.shuffle(y)
print(y) # [4, 5, 1, 3, 2]
print(x) # [1, 2, 3, 4, 5]

上記の例では、リストxをコピーして、yという別のリストを作成しています。yに対してshuffle関数を実行することで、ランダムに並び替えています。元のリストxは、変更されていません。

まとめ

Pythonのcopy関数は、オブジェクトをコピーするための関数です。copy関数を使用することで、オブジェクトを変更せずに別のオブジェクトに対して同じ操作を行うことができます。しかし、copy関数は浅いコピーを行うため、注意が必要です。また、deepcopy関数を使用することで、深いコピーを行うことができます。

copy関数は、リストのソートにおける安定性の確保や、リストの要素をランダムに並び替えるなど、実用的なコードにも活用されます。