반응형
🌏 파이썬 얕은 복사 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]] ← 원본 변경과 무관
이 경우, a와 b는 완전히 독립된 구조를 가지므로 서로 영향을 주지 않습니다.
🌏 활용
✅ 문제 상황
AI 개발에서는 다음과 같은 상황에서 얕은 복사 버그가 자주 터집니다.
- 하이퍼파라미터 딕셔너리 복사
params = {"lr": 0.001, "optimizer": {"type": "Adam", "beta": [0.9, 0.999]}} new_params = params.copy() new_params["optimizer"]["beta"][0] = 0.8 # 원본까지 수정됨!- 데이터 전처리 파이프라인
- 학습용/검증용 데이터셋을 나누면서
.copy()를 사용해 복사했는데, label 컬럼이나 normalization이 동시에 변함.
- 학습용/검증용 데이터셋을 나누면서
- 모델 파라미터 실험 중 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()로 안전하게 복사하는 것이 좋습니다.

도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!
반응형
'ETC' 카테고리의 다른 글
| [🌟총 상금 2000만원🌟] 인바디 메이커톤 안내 (2023.07.29 ~ 2023.07.30) (0) | 2023.06.15 |
|---|---|
| [기타] 화살표 하트 특수문자 연산 기호 아이폰 이모티콘 모음 (4) | 2023.03.25 |