얕은 복사와 깊은 복사의 차이점

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

  • Python 개발자, 특히 객체 복사와 메모리 관리에 관심 있는 중급 이상 개발자
  • 난이도: 중급(참조 및 복사 메커니즘 이해 필요)

핵심 요약

  • copy()는 얕은 복사로, 객체의 1단계 참조만 복제 (v1 is v2 결과가 False지만 내부 요소는 공유)
  • deepcopy()는 모든 중첩된 객체를 재귀적으로 복제 (예: 3D 이터레이터에서 v5 is v6False가 됨)
  • 이터레이터는 얕은 복사 시에도 next() 호출 시 동일한 객체 참조가 유지될 수 있음 (v3 is v4True인 경우)

섹션별 세부 요약

1. 변수 할당과 참조 관계

  • v1 = iter([iter(['a'])])
  • v2 = v1v1 is v2True (동일한 객체 참조)
  • next(v1) 호출 시 StopIteration 예외 발생 가능

2. `copy()`의 얕은 복사 동작

  • v2 = copy(v1)v1 is v2False (다른 객체 생성)
  • v3 = next(v1)v4 = next(v2)v3 is v4True (내부 이터레이터 공유)
  • print(next(v3))a, print(next(v4))StopIteration

3. `deepcopy()`의 깊은 복사 동작

  • v2 = deepcopy(v1)v1 is v2False (완전히 새로운 객체 생성)
  • v3 = next(v1)v4 = next(v2)v3 is v4False (내부 이터레이터도 별도로 생성)
  • 3D 이터레이터의 경우 v5 is v6False (모든 레벨의 중첩 구조 복제)

4. 3D 이터레이터 예제

  • v1 = iter([iter([iter(['a'])])])
  • v2 = deepcopy(v1)v1 is v2False
  • v3 = next(v1)v4 = next(v2)v3 is v4False
  • v5 = next(v3)v6 = next(v4)v5 is v6False
  • print(next(v5))a, print(next(v6))a

결론

  • 중첩된 객체를 복사할 때는 deepcopy() 사용 (예: from copy import deepcopy)
  • 이터레이터는 next() 호출 시 참조 동작이 복잡할 수 있으므로 주의 필요
  • copy()는 간단한 데이터 구조에서만 사용 (중첩 구조는 deepcopy() 권장)