[python]割り当てとコピー/浅いコピー、深いコピー(浅いコピー、深いコピー)


📍割り当てとコピー


配分とコピーは似ているように見えますが、違いがあります.比較するために、まずリストを他の変数に割り当てましょう.
リストaをbに割り当てる
a = [1, 2, 3]
b = a
リストは他の変数に割り当てられているため、2つのリストがある可能性がありますが、確認すると、リストは次のように1つになります.
演算子で2つのリストを確認すると、Trueが表示されます.
名前は違いますが、実は同じリストです
a is b 
-> True
したがって、bの要素を変更すると、aも変更されます.
bの1番インデックスを5に変更
b[1] = 5
print(a)
-> [1, 5, 3]
print(b)
-> [1, 5, 3]
画像で確認すると、次のように分かりやすいです.
コピーしてみましょう.
今回も配布ではなく同じリストをコピーしてみました.
aをbにコピー
a = [1, 2, 3]
b = a.copy()
今度はどうなるんだろう…?
ああ...少し違う
前の割り当て図と比較して、各リストが存在すると判断できます.
本当に違うやつかどうか確認します.
aとbを演算子として比較する
a is b
-> False
a == b
-> True
aとbは全く異なるオブジェクトであるが,aがコピーされているため,リスト中の要素はすべて同じであるため,==で比較すると同じである.
では、リストの要素を変更すると、a=bにもFalseが表示されます.
bの要素を置換
b[1] = 5
print(a)
-> [1, 2, 3]
print(b)
-> [1, 5, 3]
リストbは変更されたが、aは依然として残っている.
割り当てると、bの要素が変更され、aも同様に変更されます.しかし、コピーを行うと、aには何の影響もありません.画像を見ると分かりやすいです.

では、tupleを使用して割り当てやコピーを行うとどうなるのでしょうか.
気になるならやってみよう
分配継ぎ手
a = (1, 2, 3)
b = a
パレットのコピー
a = (1, 2, 3)
b = a.copy()
-> AttributeError: 'tuple' object has no attribute 'copy'
割り当てに問題はありませんが、レプリケーションでエラーが発生します.
なぜなら、リストは作成後に変更可能なオブジェクトであり、凡例は変更不可能なオブジェクトであるからです.Pythonはこれを可変オブジェクト(可変)、不変オブジェクト(可変)と呼ぶ.

📍可変オブジェクト


オブジェクトが作成され、変更できる場合は可変オブジェクト、できない場合は可変オブジェクトと呼ばれます.次のオブジェクト区分表を見ると区別しやすくなります.

上で実行したパレット割り当てをもう一度見てみましょう.
分配継ぎ手
a = (1, 2, 3)
b = a

tupleは変更できないオブジェクトなので、bの要素を変更するときにaも変更されるかどうかをチェックする必要はありません.最初は不可能だったから!しかし、再配分されたらどうなるのでしょうか.
継ぎ手の再配分
a = (1, 2, 3)
b = a
b = (4, 5)

このように変数に再割り当てを再割り当てと呼ぶ.再割り当ての結果から,aに影響を及ぼさないと判断できる.
immutableオブジェクトをコピーまたは変更すると、エラーコードが発生する可能性がありますが、可変オブジェクトはそうではありません.したがって,知らず知らずのうちに変化する可能性があるので,浅いコピー,深いコピーの概念を理解する必要がある.

📍浅いレプリケーション


まず例から聞きます.copyというモジュールの浅いコピーを使用します!
import copy

a = [1, 2, [3, 4]]
b = copy.copy(a)

print(b)
-> [1, 2, [3, 4]]
出力結果が正しくコピーされました.では、今回はbの要素を変更します.
b[0] = 5

print(b)
-> [5, 2, [3, 4]]
print(a)
-> [1, 2, [3, 4]]
確認してみると、bの要素だけが変わっていて、aは元のものです.
今回は、リスト内のリスト要素を変更します.
import copy

a = [1, 2, [3, 4]]
b = copy.copy(a)

b[2].append(5)

print(b)
-> [1, 2, [3, 4, 5]]
print(a)
-> [1, 2, [3, 4, 5]]
うん?今度はaも変わった.理由は何ですか.
絵を見ると分かりやすい.
これは初めてコピーした時の写真です.

0、1番のインデックス1、2はそれぞれリストを生成します.
ただし、リスト内のリスト[3,4]は、割り当て時と同じリストになります.
したがって、外部リストの要素を最初のように変更すると、次のようになります.

2つ目に示すように、リスト内のリストの要素を変更すると、次のようになります.

最終的には、浅い放射線は最も外の殻だけを放射することができます.
したがって、内部要素にコピーするには、深度コピーが必要です.

📍ディープコピー(deepcopy)


深度レプリケーションはcopyモジュールの機能も利用しています.
import copy

a = [1, 2, [3, 4]]
b = copy.deepcopy(a)

b[2].append(5)

print(b)
-> [1, 2, [3, 4, 5]]
print(a)
-> [1, 2, [3, 4]]
浅い放射とは異なり,深い放射ではaは変化しない.
画像で下記を確認します.

ソース:
https://dojang.io/mod/page/view.php?id=2282
https://wikidocs.net/16038