リストをディープ コピーする方法: 浅いコピーと深いコピーを理解する
リスト E0 があり、リストを使用してコピー E0_copy を作成するとします。 (E0)。直感的には、E0_copy は ID が異なるため、ディープ コピーであると考えることができます。ただし、ループ内で E0_copy を変更すると、予期せず E0 も変更されます。なぜこのようなことが起こるのでしょうか?
浅いコピーの落とし穴
list(...) は浅いコピーを作成します。つまり、参照を保持しながら最も外側のリストのみを複製します。同じ内部リストに。したがって、E0_copy の内部リストを操作すると、両方のリストが同じ内部構造を指しているため、E0 にも影響します。
解決策: ディープ コピー
実行するにはディープコピーの場合は、copy.deepcopy(...) 関数を使用します。ネストされた構造を含むすべてのオブジェクトを再帰的にコピーすることにより、本物のディープ コピーを作成します。この操作により、コピーに加えられた変更が元のコピーに影響を与えないことが保証されます。
デモ
次のコード スニペットを考えてみましょう。list(...) の結果は浅いコピー:
a = [[1, 2, 3], [4, 5, 6]] b = list(a) print(a == b) # True, indicates shallow copy
今度は、深いコピーには copy.deepcopy(...) を使用します。コピー:
import copy b = copy.deepcopy(a) print(a == b) # False, confirms deep copy
ここで、a を変更しても b には影響せず、ディープ コピーによって提供される分離が実証されています。
以上がリストのコピーを変更すると元のコピーが変更される場合があるのはなぜですか: 浅いコピーと深いコピーでは?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。