Previous Chapter:Sets and Frozen Sets
Next Chapter:Functions

Shallow and Deep Copy

Introduction


“Data Types and Variables”の章で見たように、Pythonは整数や文字列のような単純なデータ型を割り当てたりコピーしたりするとき、他のプログラミング言語と比較して奇妙な振る舞いをします。 の違いの浅部と深部をコピーするだけに該当する化合物のオブジェクトを含むオブジェクトが含その他のオブジェのようなリストまたはクラスのインスタンス.,
次のコードスニペットでは、yはXと同じメモリ位置を指しています。yに異なる値を割り当てると、この変更が発生します。

>>> x = 3>>> y = x

しかし、この内部動作がc、C++、Perlなどのプログラミング言語と比較して奇妙に見えるとしても、割り当ての観察可能な結果は私たちの期待 することも可能ですが、難しいコピー可変オブジェクトのようなリストを生成する事ができます。
Pythonは実際のコピーを作成する必要がある場合にのみ、すなわち, ユーザー、プログラマーが明示的にそれを要求する場合。
変更可能なオブジェクトをコピーするとき、すなわちリストや辞書をコピーするときに発生する可能性のある最も重要な問題を紹介します。

リストのコピー

>>> colours1 = >>> colours2 = colours1>>> colours2 = >>> print colours1

上記の例では、単純なリストがcolours1に割り当てられています。 次のステップでは、colour1をcolours2に割り当てます。 この後、新しいリストがcolours2に割り当てられます。
予想通り、colours1の値は変わりませんでした。, 例の”データ型と変数”の章のように、この変数に完全な新しいリストを割り当てたため、colours2に新しいメモリ位置が割り当てられていました。

>>> colours1 = >>> colours2 = colours1>>> colours2 = "blue">>> colours1

しかし、問題は、colours2またはcolours1のリストの要素を変更するとどうなりますか?
上記の例では、colours2の第二の要素に新しい値を割り当てます。 多くの初心者は、colours1のリストも”自動的に”変更されていることに驚くでしょう。,
説明は、colours2への新しい割り当てはなく、その要素のいずれかにのみ割り当てられているということです。

Copy with The Slice Operator

上記で説明した副作用なしに、slice演算子で浅いリスト構造を完全にコピーすることができます。

>>> list1 = >>> list2 = list1>>> list2 = 'x'>>> print list2>>> print list1>>> 

しかし、リストにサブリストが含まれるとすぐに、同じ難しさ、すなわちサブリストへのポインタだけがあります。,

>>> lst1 = ]>>> lst2 = lst1

この動作は次の図に示されています。

二つのリストのいずれかの0番目の要素に新しい値を割り当てると、副作用はありません。 サブリストの要素のいずれかを変更すると、問題が発生します。

>>> lst1 = ]>>> lst2 = lst1>>> lst2 = 'c'>>> lst2 = 'd'>>> print(lst1)]

次の図は、サブリストの要素のいずれかが変更された場合に何が起こるかを示しています:lst1とlst2の内容の両方が変更されます。,

モジュールコピーからメソッドdeepcopyを使用して

説明された問題の解決策は、モジュール”コピー”を使用することです。 このモジュールの手段を提供します。”コピー”で完全なコピー句任意のリストである浅層およびその他のリストが表示されます。
次のスクリプトは、上記の例とこのメソッドを使用しています。

from copy import deepcopylst1 = ]lst2 = deepcopy(lst1)lst2 = "d"lst2 = "c";print lst2print lst1

このスクリプトを次の名前で保存する場合deep_copy.py そして、”python deep_copy”でスクリプトを呼び出すと。,py”、我々は次の出力を受け取ります:

$ python deep_copy.py ]]

前の章:セットと凍結されたセット
次の章:関数

コメントを残す

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