浅いコピー、深いコピー、通常の代入操作の違いは何ですか? 質問する

浅いコピー、深いコピー、通常の代入操作の違いは何ですか? 質問する
import copy

a = "deepak"
b = 1, 2, 3, 4
c = [1, 2, 3, 4]
d = {1: 10, 2: 20, 3: 30}

a1 = copy.copy(a)
b1 = copy.copy(b)
c1 = copy.copy(c)
d1 = copy.copy(d)


print("immutable - id(a)==id(a1)", id(a) == id(a1))
print("immutable - id(b)==id(b1)", id(b) == id(b1))
print("mutable - id(c)==id(c1)", id(c) == id(c1))
print("mutable - id(d)==id(d1)", id(d) == id(d1))

次のような結果が得られます。

immutable - id(a)==id(a1) True
immutable - id(b)==id(b1) True
mutable - id(c)==id(c1) False
mutable - id(d)==id(d1) False

deepcopy を実行する場合:

a1 = copy.deepcopy(a)
b1 = copy.deepcopy(b)
c1 = copy.deepcopy(c)
d1 = copy.deepcopy(d)

結果は同じです:

immutable - id(a)==id(a1) True
immutable - id(b)==id(b1) True
mutable - id(c)==id(c1) False
mutable - id(d)==id(d1) False

代入演算を行う場合:

a1 = a
b1 = b
c1 = c
d1 = d

結果は次のようになります。

immutable - id(a)==id(a1) True
immutable - id(b)==id(b1) True
mutable - id(c)==id(c1) True
mutable - id(d)==id(d1) True

コピー間の違いが正確には何なのか説明してくれる人はいますか? それは可変オブジェクトと不変オブジェクトに関連するものでしょうか? もしそうなら、説明していただけますか?

ベストアンサー1

通常の代入操作では、新しい変数を既存のオブジェクトに向けるだけです。ドキュメント浅いコピーと深いコピーの違いを説明します。

浅いコピーと深いコピーの違いは、複合オブジェクト (リストやクラス インスタンスなどの他のオブジェクトを含むオブジェクト) にのみ関係します。

  • 浅いコピーでは、新しい複合オブジェクトが構築され、その後 (可能な範囲で) 元のオブジェクトにあるオブジェクトへの参照が挿入されます。

  • ディープ コピーでは、新しい複合オブジェクトが構築され、その後、元のオブジェクトにあるオブジェクトのコピーが再帰的に挿入されます。

ここにちょっとしたデモンストレーションがあります:

import copy

a = [1, 2, 3]
b = [4, 5, 6]
c = [a, b]

通常の代入演算を使用してコピーします。

d = c

print id(c) == id(d)          # True - d is the same object as c
print id(c[0]) == id(d[0])    # True - d[0] is the same object as c[0]

浅いコピーを使用する:

d = copy.copy(c)

print id(c) == id(d)          # False - d is now a new object
print id(c[0]) == id(d[0])    # True - d[0] is the same object as c[0]

ディープコピーの使用:

d = copy.deepcopy(c)

print id(c) == id(d)          # False - d is now a new object
print id(c[0]) == id(d[0])    # False - d[0] is now a new object

おすすめ記事