실버를 위한 코딩/파이썬 연습

얕은 복사(shallow copy)와 깊은 복사(deep copy)

forSilver 2025. 5. 6. 04:39
반응형

얕은 복사(shallow copy) 깊은 복사(deep copy)

파이썬에서 얕은 복사(shallow copy)깊은 복사(deep copy)는 자료구조, 특히 리스트, 딕셔너리 등 변경 가능한 객체를 다룰 때 매우 중요한 개념입니다. 아래에서 차이점을 예시와 함께 설명드리겠습니다.


🔹 1. 얕은 복사 (Shallow Copy)

얕은 복사는 가장 바깥쪽 객체만 새로 복사하고, 내부에 포함된 객체는 원본과 동일한 참조를 공유합니다.

예시:

import copy

original = [[1, 2], [3, 4]]
shallow = copy.copy(original)

이때 구조는 다음과 같습니다:

  • original과 shallow는 서로 다른 리스트이지만,
  • original[0], original[1]은 shallow[0], shallow[1]과 같은 객체입니다.

확인:

shallow[0][0] = 999
print(original)  # [[999, 2], [3, 4]]

→ 내부 리스트가 함께 변경됩니다. 즉, 내부 객체는 복사되지 않음.


🔹 2. 깊은 복사 (Deep Copy)

깊은 복사는 모든 계층의 객체를 재귀적으로 복사합니다. 따라서 원본과 복사본은 완전히 독립적입니다.

예시:

import copy

original = [[1, 2], [3, 4]]
deep = copy.deepcopy(original)

이제 구조는 다음과 같습니다:

  • deep은 original과 전혀 다른 객체.
  • 내부 리스트까지 새로 만들어져 참조가 완전히 끊깁니다.

확인:

deep[0][0] = 999
print(original)  # [[1, 2], [3, 4]]

→ 원본은 전혀 영향을 받지 않습니다.


🔹 간단 비교 요약

항목 얕은 복사 (copy.copy)  깊은 복사 (copy.deepcopy)
바깥 객체 새로 생성 새로 생성
내부 객체 참조 공유 (같은 객체) 새로 생성 (독립 객체)
속도 빠름 느릴 수 있음
사용 상황 구조가 1단계일 때 적합 중첩된 구조일 때 필요

🔹 리스트에 직접 적용한 예

import copy

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

b[1][0] = 100
print(a)  # [1, [100, 3]] ← 얕은 복사 영향

c[1][0] = 200
print(a)  # [1, [100, 3]] ← 깊은 복사는 영향 없음