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

개발공부를해보자·2025년 1월 22일

공부 정리

목록 보기
16/32
  • backtracking 문제를 풀다 보면 path[:]를 결과에 추가하는 경우가 많다.
  • path로 하면 이전에 추가한 결과들이 같이 바뀔 수 있기 때문이다.
  • 그런데 값만 복사하기 위한 방법으로 [:]도 있고 copy모듈을 사용하는 방법도 있는데 어떤 차이일 지 궁금해 찾아보았다.
  • 얕은 복사(b[:])는 리스트의 최상위 객체만 새로 복사하며, 내부 가변 객체는 원본과 참조를 공유하기 때문에 변경 시 원본에도 영향을 미칠 수 있다.
  • 반면, 깊은 복사(copy.deepcopy(b))는 리스트와 내부 객체까지 모두 독립적으로 복사하여 원본과 완전히 분리된 복제본을 생성한다.
  • 즉, 내부에 가변 객체가 있을 때 차이가 생기며 이 경우 깊은 복사를 사용하는 것이 안전하다.
  • 아래 내용은 GPT의 도움을 받아 정리한 내용이다.
# 리스트 복사 방법: 얕은 복사 vs 깊은 복사

import copy

# 1. 얕은 복사 (Shallow Copy)
# 방법: a = b[:]
# 특징: 최상위 리스트만 새 객체로 복사되며, 내부 가변 객체는 원본과 공유됨.
b = [1, 2, [3, 4]]
a = b[:]  # 얕은 복사

a[0] = 100  # 원본에 영향 없음
a[2][0] = 300  # 원본 b의 내부 리스트가 영향을 받음

print("Shallow Copy")
print("a:", a)  # 출력: [100, 2, [300, 4]]
print("b:", b)  # 출력: [1, 2, [300, 4]]  # 내부 리스트가 영향을 받음

# 2. 깊은 복사 (Deep Copy)
# 방법: a = copy.deepcopy(b)
# 특징: 리스트뿐만 아니라 내부의 모든 객체까지 새로운 복사본을 생성하여 원본과 완전히 독립적임.
b = [1, 2, [3, 4]]
a = copy.deepcopy(b)  # 깊은 복사

a[0] = 100  # 원본에 영향 없음
a[2][0] = 300  # 원본에도 영향 없음

print("\nDeep Copy")
print("a:", a)  # 출력: [100, 2, [300, 4]]
print("b:", b)  # 출력: [1, 2, [3, 4]]  # 원본 그대로 유지됨

# 언제 어떤 방식을 선택할까?
# - 얕은 복사: 리스트 내부에 불변 객체만 있을 때, 성능이 중요한 경우.
# - 깊은 복사: 리스트 내부에 가변 객체가 있으며 원본과 완전히 독립된 복사가 필요할 때.
구분얕은 복사 (b[:])깊은 복사 (copy.deepcopy(b))
복사 범위최상위 리스트만 복사전체 리스트와 내부 객체까지 복사
내부 변경 영향내부 가변 객체는 원본과 공유내부 객체도 완전히 독립됨
성능빠름 (O(n))느림 (O(n + m), 재귀적 복사)
메모리 사용적음많음
적용 사례내부 불변 객체만 있을 때 사용내부 가변 객체가 있을 때 사용
profile
개발 공부하는 30대 비전공자 직장인

0개의 댓글