Python コピーオブジェクト

Vaibhhav Khetarpal 2023年1月30日
  1. Python で浅いコピーを使用してオブジェクトをコピーする
  2. Python でディープコピーを使用してオブジェクトをコピーする
Python コピーオブジェクト

Python では、代入ステートメントにはオブジェクトをコピーする機能はありませんが、元のオブジェクトの参照を共有する新しい変数を生成するだけです。

コピーはプログラミングで非常に役立ち、主に一方のコピーのコードをもう一方のコピーに損傷を与えることなく編集するために必要です。

このチュートリアルでは、Python でオブジェクトをコピーするためのさまざまな方法について説明します。

Python で浅いコピーを使用してオブジェクトをコピーする

シャローコピー操作を使用するには、copy モジュールをインポートする必要があります。copy モジュールは、一般的なディープコピー操作とシャローコピー操作を使用する機能をプログラマーに提供します。

浅いコピーは基本的に、元の要素で見つかった子オブジェクトの参照を格納する新しい収集オブジェクトを作成します。このプロセスは再帰的ではないため、子オブジェクトのコピーは作成されません。

浅いコピー操作が発生すると、参照が新しいオブジェクトにコピーされます。これは、オブジェクトのコピーに変更が加えられた場合、これらの変更は元のオブジェクトにも反映されることを意味します。

次のコードは、浅いコピー操作を使用して Python でオブジェクトをコピーします。

import copy

# the original list
ol = [2, 4, [1, 8], 6, 8]

# using copy to shallow copy
nl = copy.copy(ol)

print("Original list before shallow copy")
for x in range(0, len(ol)):
    print(ol[x], end=" ")

print("\r")

# modfying the new list
nl[2][0] = 9

print("Original list after shallow copy")
for x in range(0, len(ol)):
    print(ol[x], end=" ")

出力:

Original list before shallow copy
2 4 [1, 8] 6 8 
Original list after shallow copy
2 4 [9, 8] 6 8

前述のように、この操作では子プロセスのコピーは作成されません。したがって、浅いコピーは完全に自立しているわけではなく、元のオブジェクトに依存していると言えます。

Python でディープコピーを使用してオブジェクトをコピーする

ディープコピー操作とシャローコピー操作の両方を使用するには、copy モジュールを Python コードにインポートする必要があります。

ディープコピー操作では、コピープロセスは常に再帰的に発生します。ディープコピー操作では、最初に新しい収集オブジェクトが作成され、次に元の要素で見つかった子オブジェクトのコピーが追加されます。

基本的に、ディープコピープロセスでは、元のオブジェクトのコピーが新しい収集オブジェクトに渡されます。したがって、オブジェクトのコピーに変更が加えられた場合、これらの変更は元のオブジェクトに反映されません。このディープコピー操作を実装するには、deepcopy() 関数を使用します。

次のコードは、deepcopy() 関数を使用して Python でディープコピー操作を実装します。

import copy

# original list
ol = [2, 4, [1, 8], 6, 8]

# use deepcopy() to deep copy
nl = copy.deepcopy(ol)

# original elements of list
print("Original list before deep copying")
for x in range(0, len(ol)):
    print(ol[x], end=" ")

print("\r")

# adding and element to new list
nl[2][0] = 9

# The second list after changes
print("The new list after modifications ")
for x in range(0, len(ol)):
    print(nl[x], end=" ")

print("\r")

print("Original list after deep copying")
for x in range(0, len(ol)):
    print(ol[x], end=" ")

出力:

Original list before deep copying
2 4 [1, 8] 6 8 
The new list after modifications 
2 4 [9, 8] 6 8 
Original list after deep copying
2 4 [1, 8] 6 8 

上記の文で説明されているように、ディープコピーは子オブジェクトを再帰的に複製できます。つまり、元のオブジェクトに依存せず、自立しています。

ディープコピー操作を作成することの唯一の欠点は、シャローコピー操作よりも比較的遅く、実行に時間がかかることです。

Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.

LinkedIn

関連記事 - Python Object