深いコピーと浅いコピーとは何かについて説明する前に、まずこの現象を見てみましょう:
a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b
なぜ b だけを変更するのに、それが a に影響するのでしょうか?前回の記事で述べたとおり、すべてのメモリ参照はシーケンスに格納されます。
つまり、b を通して内部の空のリストを変更すると、実際にはメモリ内の同じオブジェクトを変更することになるため、a に影響します。
a = ['scolia', 123, [], ] b = a[:] print id(a), id(a[0]), id(a[1]), id(a[2]) print id(b), id(b[0]), id(b[1]), id(b[2])
コードは正しく検証されているため、a と b は 2 つの異なるオブジェクトですが、内部の参照は同じです。これはいわゆる新しいオブジェクト、古いコンテンツです。
しかし、浅いコピーはそれだけではありません。以下を見てください:
a = ['scolia', 123, [], ] b = a[:] b[1] = 666 print a print b
何が起こっているのですか?
Python での変数の代入に関する私の説明を読んだ学生ならわかるでしょう: 文字列や数値などの不変のデータ型の場合、変更は再代入と同じです。ここでは、参照を更新することに相当します。
コードを確認してください:
a = ['scolia', 123, [], ] b = a[:] b[1] = 666 print id(a), id(a[0]), id(a[1]), id(a[2]) print id(b), id(b[0]), id(b[1]), id(b[2])
正しいようです。
上記は浅いコピーです。要約すると、浅いコピーは一連の参照をコピーするだけであり、コピーされたオブジェクトの変更可能なデータ型は変更されないため、元のオブジェクトは影響を受けます。変更不可能なオブジェクトを変更すると、新しいオブジェクトが作成され、参照が更新されるため、元のオブジェクトへの参照が異なり、結果も異なります。
浅いコピーの作成方法:
1. スライス操作
2. list() ファクトリ関数を使用して新しいオブジェクトを作成します。 (b = list(a))
つまり、ディープコピーとは、内部で参照されているオブジェクトを再作成し、新しい一連の参照を生成することを意味します。
基本的にはこんな感じですが、文字列や数値など変更できないオブジェクトについては、新規にコピーするのはちょっともったいない気がします とにかく変更したいときは新規オブジェクトを作成して参照を更新します。したがって、元の参照を引き続き使用しても問題はなく、メモリを節約するという目的も達成できます。
コード検証を見てください:
from copy import deepcopy a = ['scolia', 123, [], ] b = deepcopy(a) b[1] = 666 print id(a), id(a[0]), id(a[1]), id(a[2]) print id(b), id(b[0]), id(b[1]), id(b[2])
検証は正しいです。
ディープコピーの作成:
1. コード例と同様に、組み込みコピーモジュールの deepcopy() メソッドを通じてのみ作成できます。
さて、ダークコピーとシャローコピーの問題についてはここでやめましょう。エラーがある場合や追加する必要がある場合は、後で続けます。
Python の浅いコピーと深いコピーについての詳細な理解に関する上記の記事は、編集者が共有したすべての内容です。参考にしていただければ幸いです。また、皆様にも PHP 中国語 Web サイトをサポートしていただければ幸いです。
Python の浅いコピーと深いコピーに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。