ホームページ >バックエンド開発 >Python チュートリアル >Python リストの浅いコピーと深いコピー: `copy.deepcopy()` をいつ使用する必要がありますか?

Python リストの浅いコピーと深いコピー: `copy.deepcopy()` をいつ使用する必要がありますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-09 20:51:11853ブラウズ

Shallow vs. Deep Copy in Python Lists: When Should I Use `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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。