부부의 코딩 성장 일기

얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy) 본문

Python/Fundamentals

얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)

펩시_콜라 2024. 2. 18. 19:00

얕은 복사란?

  • 원본 객체의 요소들을 새로운 객체로 복사하지만, 내부에 있는 객체들은 참조로 복사
    • 내부 객체는 그래서 동일한 객체를 가리키게 됨
  • 아래 예제를 보면
    • 단순히 list를 copy한 후, 기존 리스트(original_list)를 변경하면, 
    • 얕은 복사를 한 shallow_copy도 값이 변하게 됨. 
    • "내부 객체가 동일한 객체 - 같은 주소"를 가리키고 있기 때문!
original_list = [1, [2, 3], 4]
shallow_copy = original_list.copy()

# 얕은 복사 후 내부 리스트의 참조는 동일함
original_list[1][0] = 99
print(original_list)    # 출력: [1, [99, 3], 4]
print(shallow_copy)     # 출력: [1, [99, 3], 4]

 

깊은 복사란?

  • 반면, 깊은 복사는 원본 객체와 그 내부에 있는 모든 객체를 완전히 복사하여, 새로운 객체가 만들어지고,
  • 이는 원본 객체와는 완전히 독립적인 복사본이 됨. 
  • 아래의 예제를 보면,
    • deepcopy()를 수행했을 시, 기존 리스트(original_list)를 수정하여도, 기존리스트를 깊은 복사한 deep_copy는 변경이 되지 않음을 알 수 있음.
    • 즉, 원본 객체 및 그 하위 객체들을 모두 새로운 복사본으로 만들어내어, 완전히 독립적인 구조를 갖게 됨.
import copy

original_list = [1, [2, 3], 4]
deep_copy = copy.deepcopy(original_list)

# 깊은 복사 후 내부 리스트의 참조는 독립적임
original_list[1][0] = 99
print(original_list)    # 출력: [1, [99, 3], 4]
print(deep_copy)        # 출력: [1, [2, 3], 4]

 

Deep Copy의 구현?

  • https://leetcode.com/problems/clone-graph/ 이 문제를 풀다가, Deep Copy와 Shallow Copy의 명확한 차이를 몰라서 헤맸었다.
  • python의 deepcopy()함수는 객체와 그 객체 내부의 모든 객체까지 깊은 복사를 수행하는 방식으로 구현이 된다. Python의 copy모듈은 C로 구현되어 있어서 성능상 이점을 가지고 있다고 한다.

 

어떤 데이터타입에서 고려가 필요할까?

  • 만약 객체가 immutable한 데이터 타입이라면 (ex. int, float, str, tuple 등) 생성 후 내부의 값을 변경할 수 없기 때문에 참조를 공유하더라도 문제가 생기지 않는다.
  • 다만, List나 Dictionary같은 데이터형태의 경우, mutable한 데이터타입이기 때문에, copy시 유의할 필요가 있다.