얕은 복사와 깊은 복사의 차이점
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- Python 개발자, 특히 객체 복사와 메모리 관리에 관심 있는 중급 이상 개발자
- 난이도: 중급(참조 및 복사 메커니즘 이해 필요)
핵심 요약
copy()
는 얕은 복사로, 객체의 1단계 참조만 복제 (v1 is v2
결과가False
지만 내부 요소는 공유)deepcopy()
는 모든 중첩된 객체를 재귀적으로 복제 (예: 3D 이터레이터에서v5 is v6
이False
가 됨)- 이터레이터는 얕은 복사 시에도
next()
호출 시 동일한 객체 참조가 유지될 수 있음 (v3 is v4
가True
인 경우)
섹션별 세부 요약
1. 변수 할당과 참조 관계
v1 = iter([iter(['a'])])
v2 = v1
→v1 is v2
가True
(동일한 객체 참조)next(v1)
호출 시StopIteration
예외 발생 가능
2. `copy()`의 얕은 복사 동작
v2 = copy(v1)
→v1 is v2
가False
(다른 객체 생성)v3 = next(v1)
와v4 = next(v2)
→v3 is v4
가True
(내부 이터레이터 공유)print(next(v3))
→a
,print(next(v4))
→StopIteration
3. `deepcopy()`의 깊은 복사 동작
v2 = deepcopy(v1)
→v1 is v2
가False
(완전히 새로운 객체 생성)v3 = next(v1)
와v4 = next(v2)
→v3 is v4
가False
(내부 이터레이터도 별도로 생성)- 3D 이터레이터의 경우
v5 is v6
가False
(모든 레벨의 중첩 구조 복제)
4. 3D 이터레이터 예제
v1 = iter([iter([iter(['a'])])])
v2 = deepcopy(v1)
→v1 is v2
가False
v3 = next(v1)
와v4 = next(v2)
→v3 is v4
가False
v5 = next(v3)
와v6 = next(v4)
→v5 is v6
가False
print(next(v5))
→a
,print(next(v6))
→a
결론
- 중첩된 객체를 복사할 때는
deepcopy()
사용 (예:from copy import deepcopy
) - 이터레이터는
next()
호출 시 참조 동작이 복잡할 수 있으므로 주의 필요 copy()
는 간단한 데이터 구조에서만 사용 (중첩 구조는deepcopy()
권장)