ETC

[Python] 얕은복사 vs 깊은복사

깃짱 2025. 10. 27. 13:00
반응형

🌏 파이썬 얕은 복사 vs 깊은 복사

✅ 얕은 복사

 

 

파이썬에서 리스트나 딕셔너리 같은 mutable 객체를 복사할 때, 기본적으로는 객체의 ‘참조 주소’만 복사됩니다.

즉, 새로운 변수는 생기지만, 내부 데이터는 여전히 원본과 같은 메모리를 가리킵니다.

a = [[1, 2], [3, 4]]
b = a.copy()  # 얕은 복사 (shallow copy)

a[0][0] = 99
print(b)  # [[99, 2], [3, 4]]  ← 내부 리스트가 같이 바뀜!

이처럼 겉보기엔 다른 객체처럼 보여도, 내부의 하위 객체(list, dict 등)는 같은 주소를 공유하기 때문에 내부 데이터를 수정하면 다른 쪽에도 반영됩니다.

✅ 깊은 복사

“완전히 새로운 객체를 새로 만들어 복사하는 방식”

깊은 복사는 객체의 모든 계층을 새롭게 복제합니다. 즉, 내부 리스트나 딕셔너리까지 전부 새로 만들어 다른 주소에 할당합니다.

import copy

a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)  # 깊은 복사 (deep copy)

a[0][0] = 99
print(b)  # [[1, 2], [3, 4]] ← 원본 변경과 무관

이 경우, ab는 완전히 독립된 구조를 가지므로 서로 영향을 주지 않습니다.

🌏 활용

✅ 문제 상황

AI 개발에서는 다음과 같은 상황에서 얕은 복사 버그가 자주 터집니다.

  1. 하이퍼파라미터 딕셔너리 복사
  2. params = {"lr": 0.001, "optimizer": {"type": "Adam", "beta": [0.9, 0.999]}} new_params = params.copy() new_params["optimizer"]["beta"][0] = 0.8 # 원본까지 수정됨!
  3. 데이터 전처리 파이프라인
    • 학습용/검증용 데이터셋을 나누면서 .copy()를 사용해 복사했는데, label 컬럼이나 normalization이 동시에 변함.
  4. 모델 파라미터 실험 중 checkpoint 비교
    • baseline 모델을 복사해서 다른 하이퍼파라미터로 실험하려는데 weight가 얕게 복사돼 이전 모델까지 손상되는 경우.

✅ 활용 상황

상황 권장 복사 방식
단순 값 복사 (list of int, float 등) .copy() 또는 슬라이싱
중첩 리스트, 딕셔너리 copy.deepcopy()
넘파이 배열 .copy() (깊은 복사로 동작)
DataFrame 일부 선택 .copy(deep=True) 명시 필요

[예시] Pandas에서의 대표 버그

df2 = df1[:10]  # 얕은 복사 (Warning 발생)
df2['col'] = 123  # 원본 df1도 변경될 수 있음
df2 = df1[:10].copy()  # 깊은 복사 → 안전

파이썬에서 리스트나 딕셔너리를 복사할 때는 기본적으로 얕은 복사가 일어나기 때문에, 내부 참조를 공유하는 구조에서는 원본까지 변할 수 있습니다. 특히 AI 실험 코드에서 하이퍼파라미터 dict나 모델 상태를 다룰 때는 항상 copy.deepcopy()로 안전하게 복사하는 것이 좋습니다.

 

 

 

 

도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!

 

반응형