얕은 복사(Shallow Copy)
- 최상위 객체만 복사하고 중첩된 객체 내부의 데이터는 복사되지 않음
- 객체 내부에 포함된 중첩 객체는 원본과 동일한 참조를 가짐
- 리스트나 딕셔너리 같은 가변 객체에 주로 해당
- 복사본의 일부가 변경될 경우 원본도 영향을 받을 수 있음
- 1차원 리스트나 데이터 구조가 간단한 경우
- copy 모듈의 copy 함수 사용
import copy
# 원본 리스트
list_a = [1, 2, [3, 4]]
# 얕은 복사
list_b = list_a[:]
list_c = copy.copy(list_a)
# 복사본 수정
list_b[0] = 10
list_c[2][0] = 100
print("원본 리스트:", list_a)
print("복사본 리스트 b:", list_b)
print("복사본 리스트 c:", list_c)
# 결과
# 원본 리스트: [1, 2, [100, 4]]
# 복사본 리스트 b: [10, 2, [100, 4]]
# 복사본 리스트 c: [1, 2, [100, 4]]
같은 얕은 복사인데 왜 슬라이싱으로 복사한 리스트는 수정해도 원본이 안바꼈을까?
리스트 b는 새로운 정수 객체를 할당한 것이므로 원본에 영향이 없지만
리스트 c는 내부 리스트의 원소를 변경한 것이므로 원본에 영향이 있음.
> 문자열, 정수, 튜플과 같은 불변 객체 (Immutable 객체)는 얕은 복사나 깊은 복사의 영향을 받지 않습니다. 객체가 변경되는 것이 아니라 새롭게 할당되기 때문입니다.
> 리스트, 딕셔너리 같은 가변 객체(Mutable 객체)는 객체를 참조하고 있어 얕은 복사와 깊은 복사의 차이가 중요합니다.
깊은 복사(Deep Copy)
- 객체 전체를 복사하여 완전히 새로운 객체를 생성
- 중첩된 객체 내부 데이터까지 모두 복사
- 복사본과 원본은 독립적으로 동작해 영향을 미치지 않음
- 2차원 이상의 중첩 리스트, 객체 내부에 다른 객체가 포함된 경우 = 중첩된 객체까지 독립적으로 복제해야 하는 경우
- copy 모듈의 deepcopy 함수 사용
import copy
# 원본 리스트
list_a = [1, 2, [3, 4]]
# 깊은 복사
list_b = copy.deepcopy(list_a)
# 복사본 변경
list_b[2][0] = 100
print("원본 리스트:", list_a)
print("복사본 리스트:", list_b)
# 결과
# 원본 리스트: [1, 2, [3, 4]]
# 복사본 리스트: [1, 2, [100, 4]]