1. ホーム
  2. パイソン

[解決済み】シャローコピー、ディープコピー、通常の割り当て操作の違いは何ですか?

2022-04-01 12:29:33

質問

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

ディープコピーを実行すると

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

誰か、コピーの違いを正確に説明してくれませんか?それはmutable & immutable objectsに関連した何かでしょうか?もしそうなら、私にそれを説明してもらえますか?

どのように解決するのですか?

通常の代入操作では、新しい変数を既存のオブジェクトの方に向けるだけです。そのため ドキュメント は、シャローコピーとディープコピーの違いについて説明しています。

シャローコピーとディープコピーの違いは、以下の場合にのみ関係します。 複合オブジェクト(リストやリストなど、他のオブジェクトを含むオブジェクト) クラスのインスタンス)。

  • シャローコピーは、新しい複合オブジェクトを構築し、(可能な範囲で)オリジナルにあるオブジェクトへの参照を挿入します。

  • ディープコピーは、新しい複合オブジェクトを構築し、その中に、再帰的に オリジナルと同じです。

ここで少しデモをします。

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