[pythonコンセプト]コピーリスト-deepcopy()
13739 ワード
サマリ
copyモジュールのcopy.deepcopy()メソッドを使用してリストをコピーできます
>>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.deepcopy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4]]
1.代入
リストの浅いコピーを確認します.
aがbに割り当てられると、割り当て値ではなく同じメモリアドレスが表示されます.
bを変更すると、aも変更されます.>>> a = [1, 2, 3]
>>> b = a # shallow copy
>>> b[0]= 5
>>> a
[5, 2, 3]
>>> b
[5, 2, 3]
>>> id(a)
4396179528
>>> id(b)
4396179528
2.浅いコピー(浅いコピー)
リスト内のホイールで新しい値を割り当ててみます.
スムーズに値を割り当てると、次のように新しいidが与えられ、相互に影響しません.>>> a = [1,2,3]
>>> b = a[:]
>>> id(a)
140184512860480
>>> id(b)
140184512860560
>>> a == b
True
>>> a is b
False
>>> b[0] = 5
>>> a
[1, 2, 3]
>>> b
[5, 2, 3]
しかし、これらのスクライブも浅いコピーに相当します.
リスト内の可変オブジェクトがリスト内の可変オブジェクトである場合、問題が発生します.
id(a)値とid(b)値は異なるが、オブジェクトid(a[0])とid(b[0])は同じアドレスを表示している.
(再割り当ての場合は問題ありません.メモリアドレスも変更されます.例えば、a[0]=[8,9])>>> a = [[1,2], [3,4]]
>>> b = a[:]
>>> id(a)
140184512860720
>>> id(b)
140184512860480
>>> id(a[0])
140184512654064
>>> id(b[0])
140184512654064
>>> a[0].append(5)
>>> a
[[1, 2, 5], [3, 4]]
>>> b
[[1, 2, 5], [3, 4]]
copyモジュールのcopyメソッドも浅いコピーです.>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.copy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4, 5]]
3.ディープコピー(deepcopy)
深度コピーとは、内部からオブジェクトにコピーされたすべての新しいコピーです.
copy.deepcopy法で解決した.>>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.deepcopy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4]]
ソース
https://wikidocs.net/16038
Reference
この問題について([pythonコンセプト]コピーリスト-deepcopy()), 我々は、より多くの情報をここで見つけました
https://velog.io/@leese1016/파이썬-개념-리스트-복사-deepcopy
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
>>> a = [1, 2, 3]
>>> b = a # shallow copy
>>> b[0]= 5
>>> a
[5, 2, 3]
>>> b
[5, 2, 3]
>>> id(a)
4396179528
>>> id(b)
4396179528
リスト内のホイールで新しい値を割り当ててみます.
スムーズに値を割り当てると、次のように新しいidが与えられ、相互に影響しません.
>>> a = [1,2,3]
>>> b = a[:]
>>> id(a)
140184512860480
>>> id(b)
140184512860560
>>> a == b
True
>>> a is b
False
>>> b[0] = 5
>>> a
[1, 2, 3]
>>> b
[5, 2, 3]
しかし、これらのスクライブも浅いコピーに相当します.リスト内の可変オブジェクトがリスト内の可変オブジェクトである場合、問題が発生します.
id(a)値とid(b)値は異なるが、オブジェクトid(a[0])とid(b[0])は同じアドレスを表示している.
(再割り当ての場合は問題ありません.メモリアドレスも変更されます.例えば、a[0]=[8,9])
>>> a = [[1,2], [3,4]]
>>> b = a[:]
>>> id(a)
140184512860720
>>> id(b)
140184512860480
>>> id(a[0])
140184512654064
>>> id(b[0])
140184512654064
>>> a[0].append(5)
>>> a
[[1, 2, 5], [3, 4]]
>>> b
[[1, 2, 5], [3, 4]]
copyモジュールのcopyメソッドも浅いコピーです.>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.copy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4, 5]]
3.ディープコピー(deepcopy)
深度コピーとは、内部からオブジェクトにコピーされたすべての新しいコピーです.
copy.deepcopy法で解決した.>>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.deepcopy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4]]
ソース
https://wikidocs.net/16038
Reference
この問題について([pythonコンセプト]コピーリスト-deepcopy()), 我々は、より多くの情報をここで見つけました
https://velog.io/@leese1016/파이썬-개념-리스트-복사-deepcopy
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
>>> import copy
>>> a = [[1,2],[3,4]]
>>> b = copy.deepcopy(a)
>>> a[1].append(5)
>>> a
[[1, 2], [3, 4, 5]]
>>> b
[[1, 2], [3, 4]]
https://wikidocs.net/16038
Reference
この問題について([pythonコンセプト]コピーリスト-deepcopy()), 我々は、より多くの情報をここで見つけました https://velog.io/@leese1016/파이썬-개념-리스트-복사-deepcopyテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol