Python でのコピー (ディープ コピーとシャロー コピー)

Python でのコピー (ディープ コピーとシャロー コピー)

パイソン , 代入ステートメントはオブジェクトをコピーするのではなく、ターゲットとオブジェクトの間にバインディングを作成します。を使用するときは、 = 演算子を使用すると、元のオブジェクトの参照を共有する新しい変数が作成されるだけです。これらのオブジェクトの実際のコピーまたはクローンを作成するには、コピー モジュールを使用します。 パイソン

Pythonディープコピーの構文

構文: コピー.ディープコピー(x)

Python Shallowcopy の構文

構文: コピー.コピー(x)

例:

これらのコピーを作成するには、copy モジュールを使用します。 copy() はリストの浅いコピーを返し、deepcopy() はリストの深いコピーを返します。ご覧のとおり、両方の値は同じですが、ID が異なります。

例: このコードは、 copy> ネストされたリストの浅いコピーと深いコピーの両方を作成するモジュール li1> 。浅いコピー、 li2> を使用して作成されます copy.copy()> 最上位の構造は保持しますが、内部リストへの参照は共有します。ディープなコピー、 li3> を使用して作成されます copy.deepcopy()> 、完全に独立したコピーが作成されます。 li1> 、すべてのネストされた要素を含みます。このコードは、次の ID と値を出力します。 li2> そして li3> 、参照と独立性の観点から浅いコピーと深いコピーの違いを強調しています。

Python3




import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.copy(li1)> print> (> 'li2 ID: '> ,> id> (li2),> 'Value: '> , li2)> li3> => copy.deepcopy(li1)> print> (> 'li3 ID: '> ,> id> (li3),> 'Value: '> , li3)>

出力:

  li2 ID:   2521878674624   Value:   [1, 2, [3, 5], 4]   li3 ID:   2521878676160   Value:   [1, 2, [3, 5], 4] 

Pythonのディープコピーとは何ですか?

ディープ コピーでは、元のオブジェクトにある項目のコピーを再帰的に挿入する前に、新しい複合オブジェクトが作成されます。これは、最初に新しいコレクション オブジェクトを構築し、次に元のコレクション オブジェクトにある子オブジェクトのコピーを再帰的にそのコレクション オブジェクトに追加することを意味します。ディープ コピーの場合、オブジェクトのコピーが別のオブジェクトにコピーされます。だということだ 変更があれば オブジェクトのコピーを作成する 元のオブジェクトには反映されません。

Python でのディープコピー

例:

上記の例では、リストに加えられた変更は、 影響しなかった 他のリストは、リストが深くコピーされていることを示します。

このコードは、 copy> モジュール。最初は元の要素を出力します。 li1> 、次にそれらをディープコピーして作成します li2> 。の要素への変更 li2> 影響しません li1> 、別のプリントアウトで示されているように。これは、ディープ コピーによって独立したコピーが作成され、コピーが変更された後でも元のリストの内容が維持される仕組みを強調しています。

Python3




import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.deepcopy(li1)> print> (> 'The original elements before deep copying'> )> for> i> in> range> (> 0> ,> len> (li1)):> > print> (li1[i],end> => ' '> )> print> (> ' '> )> li2[> 2> ][> 0> ]> => 7> print> (> 'The new list of elements after deep copying '> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li2[i],end> => ' '> )> print> (> ' '> )> print> (> 'The original elements after deep copying'> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li1[i],end> => ' '> )>

出力:

The original elements before deep copying 1 2 [3, 5] 4 The new list of elements after deep copying 1 2 [7, 5] 4 The original elements after deep copying 1 2 [3, 5] 4 

Pythonの浅いコピーとは何ですか?

浅いコピーは、新しい複合オブジェクトを作成し、その中のオリジナルに含まれるオブジェクトを参照します。つまり、新しいコレクション オブジェクトを構築し、それにオリジナルにある子オブジェクトへの参照を設定します。コピー プロセスは再帰されないため、子オブジェクト自体のコピーは作成されません。浅いコピーの場合、オブジェクトの参照が別のオブジェクトにコピーされます。だということだ 変更があれば オブジェクトのコピーを作成する 反省する 元のオブジェクトで。 Python では、これは次を使用して実装されます。 コピー() 関数。

Python での浅いコピー

例:

この例では、リストに加えられた変更は、 影響を与えた 別のリスト。リストが浅くコピーされていることを示します。 重要な点: 浅いコピーと深いコピーの違いは、複合オブジェクト (リストやクラス インスタンスなど、他のオブジェクトを含むオブジェクト) にのみ関係します。

  • 浅いコピーは、新しい複合オブジェクトを構築し、(可能な範囲で) オリジナルにあるオブジェクトへの参照をその中に挿入します。
  • ディープ コピーは新しい複合オブジェクトを構築し、元のオブジェクトにあるオブジェクトのコピーを再帰的に挿入します。

例: このコードは、 ' copy'> モジュール。最初に、元の要素を出力します。 li1> 、次に浅いコピーを実行します。 li2> 。の要素を変更する li2> の対応する要素に影響を与えます li1,> 両方のリストが内部リストへの参照を共有するためです。これは、浅いコピーでは新しいリストが作成されますが、ネストされた要素が完全に独立しているわけではないことを示しています。

Python3




import> copy> li1> => [> 1> ,> 2> , [> 3> ,> 5> ],> 4> ]> li2> => copy.copy(li1)> print> (> 'The original elements before shallow copying'> )> for> i> in> range> (> 0> ,> len> (li1)):> > print> (li1[i],end> => ' '> )> print> (> ' '> )> li2[> 2> ][> 0> ]> => 7> print> (> 'The original elements after shallow copying'> )> for> i> in> range> (> 0> ,> len> ( li1)):> > print> (li1[i],end> => ' '> )>

出力:

The original elements before shallow copying 1 2 [3, 5] 4 The original elements after shallow copying 1 2 [7, 5] 4 

おすすめの記事 クラスの浅いコピーと深いコピーの違い