Python에서 Shallow Copy vs Deep Copy: 면접 대비 설명

발행: (2025년 12월 23일 오후 10:41 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

Introduction

가장 흔히 등장하는 파이썬 면접 질문 중 하나는 겉보기엔 매우 단순해 보입니다:

“파이썬에서 얕은 복사와 깊은 복사의 차이는 무엇인가요?”

면접관은 이 질문을 통해 다음을 평가합니다:

  • 가변 객체와 불변 객체에 대한 이해
  • 객체 레퍼런스에 대한 파악
  • 부작용과 버그를 추론하는 능력
  • 정의만이 아니라 실제 파이썬 동작에 대한 지식

특히 백엔드, 데이터, 머신러닝 분야에서 매우 중요한 내용입니다.

Source:

얕은 복사

얕은 복사는 새로운 컨테이너 객체를 생성하지만, 그 안에 들어 있는 객체들을 재귀적으로 복사하지 않습니다. 외부 객체는 복사되지만, 내부 객체들은 여전히 공유된 참조를 가집니다.

import copy

original = [[1, 2], [3, 4]]
shallow = copy.copy(original)

shallow[0].append(99)

print(original)  # [[1, 2, 99], [3, 4]]
print(shallow)   # [[1, 2, 99], [3, 4]]
  • originalshallow는 서로 다른 리스트이지만, 내부 리스트들은 같은 메모리를 가리키고 있습니다.

깊은 복사

A 깊은 복사는 새로운 컨테이너 생성하고 모든 중첩 객체를 재귀적으로 복사하여 공유된 참조가 없도록 합니다. 복사된 구조는 완전히 독립적입니다.

import copy

original = [[1, 2], [3, 4]]
deep = copy.deepcopy(original)

deep[0].append(99)

print(original)  # [[1, 2], [3, 4]]
print(deep)      # [[1, 2, 99], [3, 4]]
  • deep에서의 변경은 original에 영향을 주지 않습니다.

Analogy

  • Shallow copy → 상자를 복사하고, 안에 있는 아이템은 복사하지 않음.
  • Deep copy → 상자 안에 있는 모든 것을 복사함.

파이썬에서 복사하는 일반적인 방법

OperationType of CopyNote
list.copy()얕은 복사
list[:]얕은 복사슬라이싱은 항상 얕은 복사입니다
dict.copy()얕은 복사
copy.copy(obj)얕은 복사
copy.deepcopy(obj)깊은 복사시간과 메모리 모두 더 많이 소요됩니다
b = a복사 없음단순 할당은 같은 객체를 공유합니다

중요한 함정

  • 오해: “얕은 복사는 모든 것을 한 번에 복사한다.”

    • 현실: 중첩된 가변 객체는 공유된다.
  • 깊은 복사의 비용:

    • 실행 속도 저하
    • 메모리 사용량 증가
    • 객체 정체성에 대한 가정이 깨질 수 있음
  • 불변 객체 (예: int, str, tuple)는 공유‑상태 문제를 일으키지 않는다.

깊은 복사를 피해야 할 때

  • 성능이 중요한 크고 깊게 중첩된 구조
  • 외부 자원(파일, DB 연결)을 보유한 객체
  • 공유 데이터의 제어된 변형이 허용되는 상황

사용자 정의 복사 동작

고급 면접 후보자는 사용자 정의 클래스가 다음과 같이 구현함으로써 복사를 제어할 수 있다고 언급할 수 있습니다:

def __copy__(self):
    # return a shallow copy of the instance
    ...

def __deepcopy__(self, memo):
    # return a deep copy of the instance
    ...

이는 많은 프레임워크가 이러한 훅에 의존하기 때문에, 고수준의 이해도를 나타냅니다.

Structured Answer to the Interview Question

얕은 복사는 새로운 컨테이너를 만들지만 중첩된 객체에 대한 참조를 공유하고, 깊은 복사는 모든 객체를 재귀적으로 복제합니다. 얕은 복사는 더 빠르고 메모리 효율적이지만 가변 중첩 데이터에서 부작용을 일으킬 수 있습니다. 깊은 복사는 공유 상태를 방지하지만 비용이 더 많이 듭니다. 파이썬은 얕은 복사를 위해 copy.copy()를, 깊은 복사를 위해 copy.deepcopy()를 제공합니다.

실전 버그와 복사 관련

  • 공유된 참조: 한 복사본에서 중첩 객체를 변형하면 다른 복사본에 의도치 않게 영향을 미칩니다.
  • 독립성 가정: 얕은 복사를 완전한 독립으로 취급하면 미묘한 버그가 발생합니다.

왜 이런 버그가 발생하는지 이해하면 면접 상황과 실제 코드 모두 자신 있게 다룰 수 있습니다.

Back to Blog

관련 글

더 보기 »