Data/Python

[Python] 얕은 복사와 깊은 복사

재은초 2023. 6. 18. 12:03
반응형

복사

  • 파이썬에는 얕은 복사(shallow copy), 깊은 복사(deep copy)가 있으며, 파이썬에서는 메모리 낭비를 방지하기위해 기본적으로 얕은 복사 사용.

얕은복사(Shallow Copy) = 주소복사

  • 전체 값을 항상 메모리에 복사하면 그만큼 속도가 느려지고 메모리도 공간이 부족해서 메모리 주소를 참조해 해당 값을 가져오는 얕은 복사 사용.
  • 얕은 복사라는 것은 변수를 복사했다고 생각했지만 실제로는 자료의 주소와 연결되어있는 것을 의미. 즉, 변수를 복사했지만 참조한 곳은 동일하기 때문에 같은 변수를 가리키고 있음. 그래서 변경시 원본 훼손의 우려가 있음.
  • 1차원일 때 리스트, 딕셔너리 값을 바꾸면 복사한 값도 바뀜.
  • 2차원일 때 깊이가 깊어지면서 복사한 값과 원본이 동일하게 바뀜.
# 얕은 복사
>>> arr = [10, 20, 30]
>>> copy1 = arr
>>> id(arr), id(copy1)
(139687296086096, 139687296086096)          # 같음

>>> copy1[0] = 90                           # 사본 변경
>>> copy1, arr
([90, 20, 30], [90, 20, 30])
>>> id(arr), id(copy1)
(139687296086096, 139687296086096)          # 사본 변경으로 원본도 변경됨

# 새로운 id값이 부여되어 원본에 훼손 우려가 없지만 얕은 복사인 경우
>>> copy2 = arr[:3]                         # 슬라이싱으로 새로운 값 할당
>>> arr, copy2
([90, 20, 30], [90, 20, 30])
>>> id(arr), id(copy2)
(139687296086096, 139687234775392)
>>> copy2[2] = 321                          
>>> arr, copy2                              # 원본 훼손 없음
([90, 20, 30], [90, 20, 321])

# 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]]

 

깊은복사(Deep Copy)

  • 깊은 복사는 내부에 객체들까지 모두 새롭게 copy 되는 것
  • 객체가 가진 모든 요소를 복사. 리스트와 같은 참조자료형을 복사하는 경우, 참조 주소가 아니라 데이터 자체가 복사됨-또 다른 주소에 새로 만들어짐. 따라서 한 쪽의 변형에 영향받지 않음.
  • 데이터분석에서는 원본 보존을 위해 딥카피를 기본 복사 방법으로 사용
>>> import copy
>>> copy5 = [1,2]
>>> copy6 = copy.deepcopy(copy5)
>>> copy5, copy6
([1, 2], [1, 2])
>>> id(copy5), id(copy6)               # 내용은 같으나 id값이 다름 
(139687223595248, 139687223261376)
반응형