[파이썬 개념] 리스트 복사 - deepcopy()

timtam·2022년 3월 16일
0

Python_개념

목록 보기
28/32

요약

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. 대입

list의 얕은 복사를 확인 해봅니다.
b 에 a를 할당하면 값이 할당되는 것이 아니라 같은 메모리 주소를 바라봅니다.
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. 얕은 복사(shallow copy)

list의 슬라이싱을 통한 새로운 값을 할당해봅니다.
아래의 결과와 같이 슬라이싱을 통해서 값을 할당하면 새로운 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]

하지만, 이러한 슬라이싱 또한 얕은 복사에 해당합니다.
리스트안에 리스트 mutable객체 안에 mutable객체인 경우 문제가 됩니다.
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. 깊은 복사(deep copy)

깊은 복사는 내부에 객체들까지 모두 새롭게 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]]

출처

https://wikidocs.net/16038

0개의 댓글