[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