ホームページ >バックエンド開発 >Python チュートリアル >Python リストの浅いコピーと深いコピー: `copy.deepcopy()` をいつ使用する必要がありますか?
リストの深いコピー: 浅いアプローチを超えて
list(...) を使用してリストをコピーしようとすると、リストが作成されると思われるかもしれません。 id(E0) が id(E0_copy) と異なるという観察に基づくディープ コピー。ただし、この仮定には誤りがあります。
浅いコピー トラップ
list(...) は、内部オブジェクトを再帰的にコピーするディープ コピーを実行しません。代わりに、最も外側のリストのみをコピーし、元の内側のリストへの参照を維持します。したがって、内部リストへの変更は、元のリストとコピーされたリストの両方に影響します。
copy.deepcopy によるディープ コピー
真のディープ コピーを作成するには、copy を使用します。ディープコピー(...)。このメソッドは、オブジェクトのすべてのレベルを再帰的にコピーし、コピーへの変更が元のオブジェクトに影響を与えないようにします。
例
次のコード スニペットを考えてみましょう:
>>> a = [[1, 2, 3], [4, 5, 6]] >>> b = list(a) >>> a [[1, 2, 3], [4, 5, 6]] >>> b [[1, 2, 3], [4, 5, 6]] >>> a[0][1] = 10 >>> a [[1, 10, 3], [4, 5, 6]] >>> b # b changes too -> Not a deepcopy. [[1, 10, 3], [4, 5, 6]]
この例では、list(...) は a の浅いコピーを作成します。 a[0][1] が変更されると、b も変更され、同じ内部リストを参照していることがわかります。
これを以下と比較してください。
>>> import copy >>> b = copy.deepcopy(a) >>> a [[1, 10, 3], [4, 5, 6]] >>> b [[1, 10, 3], [4, 5, 6]] >>> a[0][1] = 9 >>> a [[1, 9, 3], [4, 5, 6]] >>> b # b doesn't change -> Deep Copy [[1, 10, 3], [4, 5, 6]]
copy.deepcopy を使用すると、 a の真のディープ コピーを作成します。 a への変更は b には影響せず、内部リストの独自のコピーを持つ別個のオブジェクトであることが確認されます。
結論
リストのディープ コピーが不可欠な場合は、次のことを忘れないでください。 copy.deepcopy(...) を使用して、コピーへの変更がオリジナルに影響を与えないようにします。この理解は、データの整合性を維持し、コードでの予期せぬ結果を回避するために非常に重要です。
以上がPython リストの浅いコピーと深いコピー: `copy.deepcopy()` をいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。