backtracking 문제를 풀다 보면 path[:]를 결과에 추가하는 경우가 많다.
path로 하면 이전에 추가한 결과들이 같이 바뀔 수 있기 때문이다.
- 그런데 값만 복사하기 위한 방법으로
[:]도 있고 copy모듈을 사용하는 방법도 있는데 어떤 차이일 지 궁금해 찾아보았다.
- 얕은 복사(
b[:])는 리스트의 최상위 객체만 새로 복사하며, 내부 가변 객체는 원본과 참조를 공유하기 때문에 변경 시 원본에도 영향을 미칠 수 있다.
- 반면, 깊은 복사(
copy.deepcopy(b))는 리스트와 내부 객체까지 모두 독립적으로 복사하여 원본과 완전히 분리된 복제본을 생성한다.
- 즉, 내부에 가변 객체가 있을 때 차이가 생기며 이 경우 깊은 복사를 사용하는 것이 안전하다.
- 아래 내용은 GPT의 도움을 받아 정리한 내용이다.
import copy
b = [1, 2, [3, 4]]
a = b[:]
a[0] = 100
a[2][0] = 300
print("Shallow Copy")
print("a:", a)
print("b:", b)
b = [1, 2, [3, 4]]
a = copy.deepcopy(b)
a[0] = 100
a[2][0] = 300
print("\nDeep Copy")
print("a:", a)
print("b:", b)
| 구분 | 얕은 복사 (b[:]) | 깊은 복사 (copy.deepcopy(b)) |
|---|
| 복사 범위 | 최상위 리스트만 복사 | 전체 리스트와 내부 객체까지 복사 |
| 내부 변경 영향 | 내부 가변 객체는 원본과 공유 | 내부 객체도 완전히 독립됨 |
| 성능 | 빠름 (O(n)) | 느림 (O(n + m), 재귀적 복사) |
| 메모리 사용 | 적음 | 많음 |
| 적용 사례 | 내부 불변 객체만 있을 때 사용 | 내부 가변 객체가 있을 때 사용 |