호기심 많은 분석가

[Python] Copy VS Deep Copy 본문

Coding/Machine Learning & Python

[Python] Copy VS Deep Copy

DA Hun 2021. 5. 28. 22:23

 포스팅의 제목은 Copy VS Deep Copy로 작 상하였지만, 실제로는 Shallow Copy(얕은 복사)와 Deep Copy(깊은 복사)의 차이다. 우리는 작업을 하다가 데이터를 여러 방면에서 뜯어보아야 할 때 copy() 메서드를 통해 데이터를 복사해두곤 한다. 하지만 이 작업은 위험할 수 있다. 왜 그렇고, copy와 deep copy는 어떤 차이점을 가질까?

1. Shallow Copy(얕은 복사)

  • 객체를 복사할 때, 해당 객체만 복사하여 새 객체를 생성한다.
  • 복사된 객체의 인스턴스 변수는 원본 객체의 인스턴스 변수와 같은 메모리 주소를 참조한다
  • 따라서, 해당 메모리 주소의 값이 변경되면 원본 객체 및 복사 객체의 인스턴스 변수 값은 같이 변경된다.

2. Deep Copy(깊은 복사)

  • 객체를 복사할 때, 해당 객체와 인스턴스 변수까지 복사하는 방식
  • 전부를 복사하여 새 주소에 담기 때문에 참조를 공유하지 않는다.

 예를 통해 이해를 쉽게 해보자. 아래와 같이 copy의 경우 재할당하는 것이 아닌 a[0]에 값을 append 해주었을 때, b의 값도 같이 변함을 알 수 있다. 따라서 작업을 하다가 원본 데이터를 변화시킬 때, 복사한 데이터도 함께 변하는 것을 원하지 않는다면 copy라이브러리의 deepcopy를 활용하기를 추천한다. :)

import copy

a = [[1, 2], [3, 4]]
b = a.copy()

print(b) # [[1, 2], [3, 4]]
a[0].append(5)
print(b) # [[1, 2, 5], [3, 4]]
import copy

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)

print(b) # [[1, 2], [3, 4]]
a[0].append(5)
print(b) # [[[1, 2], [3, 4]]