파이썬에서 리스트나 딕셔너리를 복사할 때, 무심코 `=` 연산자를 사용했다가 낭패를 본 경험, 다들 한 번쯤은 있으시죠?
겉으로는 멀쩡해 보이는 코드도, 얕은 복사와 깊은 복사의 미묘한 차이 때문에 예상치 못한 오류를 뿜어낼 수 있습니다.
이번 글에서는 파이썬 복사의 핵심 개념을 파헤치고, 흔히 저지르는 실수들을 짚어보면서 여러분의 코딩 실력을 한 단계 업그레이드해 보겠습니다.
얕은 복사란 무엇일까요?
얕은 복사는 객체의 "참조값(주소값)"만 복사하는 것을 의미합니다.
쉽게 말해, 원본 객체와 복사된 객체가 같은 메모리 공간을 "공유"하는 것이죠.
따라서 복사된 객체의 내용을 변경하면 원본 객체도 함께 변경되는 side effect가 발생할 수 있습니다.
이는 마치 유명 맛집의 레시피를 "구두"로만 전수받은 것과 같습니다.
레시피를 적어놓은 원본은 하나뿐이고, 전수받은 사람은 그 레시피를 "참조"만 할 뿐이죠.
만약 전수받은 사람이 레시피를 임의로 수정하면, 원본 레시피도 함께 바뀌는 것과 같은 이치입니다.
깊은 복사는 어떻게 다를까요?
깊은 복사는 객체의 "값" 자체를 복사하는 것을 의미합니다.
원본 객체와 완전히 독립적인 새로운 객체를 생성하는 것이죠.
따라서 복사된 객체의 내용을 변경해도 원본 객체에는 아무런 영향을 미치지 않습니다.
이는 마치 유명 브랜드의 디자인을 "완벽하게 똑같이" 카피하는 것과 같습니다.
원본 디자인과는 별개의 새로운 제품이 만들어지기 때문에, 카피 제품을 수정해도 원본 디자인에는 아무런 영향이 없는 것이죠.
파이썬에서는 `copy` 모듈의 `deepcopy()` 함수를 사용하여 깊은 복사를 수행할 수 있습니다.
왜 mutable 객체에서 문제가 발생할까요?
얕은 복사와 깊은 복사는 특히 "mutable"한 객체(리스트, 딕셔너리 등)를 복사할 때 그 차이가 두드러집니다.
mutable 객체는 객체의 내용을 변경할 수 있기 때문입니다.
반면, immutable 객체(정수, 문자열, 튜플 등)는 객체의 내용을 변경할 수 없기 때문에 얕은 복사를 하든 깊은 복사를 하든 큰 차이가 없습니다.
예를 들어, 리스트 안에 리스트가 있는 경우, 얕은 복사는 외부 리스트만 복사하고 내부 리스트는 참조만 복사합니다.
따라서 내부 리스트의 값을 변경하면 원본 리스트와 복사된 리스트 모두에 영향을 미치게 됩니다.
얕은 복사와 깊은 복사, 언제 사용해야 할까요?
얕은 복사는 메모리 사용량을 줄이고 복사 속도를 높일 수 있다는 장점이 있습니다.
하지만 원본 객체가 변경되지 않도록 주의해야 합니다.
깊은 복사는 원본 객체와 복사된 객체를 완전히 분리해야 할 때 사용합니다.
예를 들어, 데이터 분석 시 원본 데이터를 보존하면서 분석을 수행해야 하는 경우 깊은 복사가 유용합니다.
최근에는 데이터 분석의 중요성이 더욱 커지고 있기 때문에, 깊은 복사의 활용도 또한 높아지고 있습니다.
실수하기 쉬운 포인트와 해결 방법
가장 흔한 실수는 `=` 연산자를 사용하여 리스트나 딕셔너리를 복사하는 것입니다.
이는 얕은 복사를 수행하므로 주의해야 합니다.
리스트의 얕은 복사를 수행하려면 `[:]` 슬라이싱을 사용하거나 `copy()` 메서드를 사용할 수 있습니다.
깊은 복사를 수행하려면 `copy` 모듈의 `deepcopy()` 함수를 사용해야 합니다.
특히, 2차원 리스트를 복사할 때는 깊은 복사를 사용하는 것을 잊지 마세요.
파이썬의 얕은 복사와 깊은 복사는 얼핏 보면 간단해 보이지만, 제대로 이해하지 못하면 예상치 못한 버그를 만들 수 있습니다.
이번 글에서 다룬 내용을 바탕으로, 여러분의 코드에서 복사 관련 오류를 줄이고 더욱 안정적인 프로그램을 만들 수 있기를 바랍니다.
기억하세요, "진짜 복사"는 `deepcopy()`입니다!
'개발' 카테고리의 다른 글
| 데코레이터(decorator)를 쉽게 이해하는 비유 (0) | 2026.02.03 |
|---|---|
| 파이썬에서 참조(reference)가 헷갈리는 이유 (0) | 2026.02.03 |
| 파이썬에서 정렬(sort) 커스터마이징하기 (0) | 2026.01.31 |
| map, filter, reduce 제대로 쓰는 법 (0) | 2026.01.31 |
| lambda 함수, 쓰지 말라는 사람도 많은 이유 (0) | 2026.01.31 |