반응형
얕은 복사(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]] ← 깊은 복사는 영향 없음
'실버를 위한 코딩 > 파이썬 연습' 카테고리의 다른 글
리스트의 주요 메서드 작동 방식 (2) | 2025.05.08 |
---|---|
중첩 리스트와 얕은복사와 깊은복사 (2) | 2025.05.07 |
리스트 안에 리스트가 포함될 경우 (1) | 2025.05.05 |
list에서 range와의 미묘한 관계 (0) | 2025.05.04 |
튜플을 활용한 파이썬 함수 호출 (1) | 2025.04.21 |