[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
Reference
この問題について([python]割り当てとコピー/浅いコピー、深いコピー(浅いコピー、深いコピー)), 我々は、より多くの情報をここで見つけました
https://velog.io/@kkamyang/Python-얕은-복사-깊은-복사-shallow-copy-deep-copy
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
a = [1, 2, 3]
b = a
a is b
-> True
b[1] = 5
print(a)
-> [1, 5, 3]
print(b)
-> [1, 5, 3]
a = [1, 2, 3]
b = a.copy()
a is b
-> False
a == b
-> True
b[1] = 5
print(a)
-> [1, 2, 3]
print(b)
-> [1, 5, 3]
a = (1, 2, 3)
b = a
a = (1, 2, 3)
b = a.copy()
-> AttributeError: 'tuple' object has no attribute 'copy'
オブジェクトが作成され、変更できる場合は可変オブジェクト、できない場合は可変オブジェクトと呼ばれます.次のオブジェクト区分表を見ると区別しやすくなります.
上で実行したパレット割り当てをもう一度見てみましょう.
分配継ぎ手
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
Reference
この問題について([python]割り当てとコピー/浅いコピー、深いコピー(浅いコピー、深いコピー)), 我々は、より多くの情報をここで見つけました
https://velog.io/@kkamyang/Python-얕은-복사-깊은-복사-shallow-copy-deep-copy
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import copy
a = [1, 2, [3, 4]]
b = copy.copy(a)
print(b)
-> [1, 2, [3, 4]]
b[0] = 5
print(b)
-> [5, 2, [3, 4]]
print(a)
-> [1, 2, [3, 4]]
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]]
深度レプリケーションは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
Reference
この問題について([python]割り当てとコピー/浅いコピー、深いコピー(浅いコピー、深いコピー)), 我々は、より多くの情報をここで見つけました https://velog.io/@kkamyang/Python-얕은-복사-깊은-복사-shallow-copy-deep-copyテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol