コンテンツにスキップ

Pythonチュートリアル:Pythonでディープコピーとシャローコピーの使い方を簡単に説明

[

Pythonオブジェクトの深いコピーと浅いコピー

basics (

Python

new_list = list(original_list)
new_dict = dict(original_dict)
new_set = set(original_set)
  • 浅いコピーは、新しいコレクションオブジェクトを構築し、それに元のオブジェクトにある子オブジェクトへの参照を入れることを意味します。要するに、浅いコピーは「1階層深い」だけです。コピーのプロセスは再帰せず、したがって子オブジェクト自体のコピーは作成しません。

  • 深いコピーは、コピーのプロセスが再帰的になることを意味します。つまり、まず新しいコレクションオブジェクトを構築し、次に元のオブジェクトにある子オブジェクトのコピーを再帰的に入れていきます。この方法でオブジェクトをコピーすると、元のオブジェクトとそのすべての子オブジェクトの完全に独立したクローンが作成されます。

では、浅いコピーと深いコピーの違いを強調するために、いくつかの例を見てみましょう。

浅いコピーの作成

以下の例では、新しいネストされたリストを作成し、list()ファクトリ関数を使用してそれを浅くコピーします。

Python

>>> xs = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> ys = list(xs) # shallow copy

これにより、ysxsと同じ内容を持つ新しい独立したオブジェクトになります。両方のオブジェクトを検査することで、これを確認できます。

Python

>>> xs
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> ys
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

ysが本当に元のオブジェクトから独立しているか確認するために、少しの実験を行いましょう。元のリスト(xs)に新しいサブリストを追加して、この変更がコピー(ys)に影響を与えなかったことを確認してみましょう。

Python

>>> xs.append(['new sublist'])
>>> xs
[[1, 2, 3], [4, 5, 6], [7, 8, 9], ['new sublist']]
>>> ys
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

どうですか、これは期待通りの効果がありますね。表面的なレベルでコピーされたリストの変更は問題ありませんでした。

ただし、元のリストの浅いコピーしか作成しなかったため、ysは元の子オブジェクトへの参照をまだ含んでいる点に注意してください。