노트

얕은 복사와 깊은 복사

Shallow Copy and Deep Copy

CS#python · 연결된 개념 9개

쉽게 말하면

얕은 복사는 폴더만 새로 만들고 안에는 원본 문서의 바로가기를 넣는 것, 깊은 복사는 문서까지 전부 새로 복제하는 거예요. 바로가기로 연 문서를 고치면 원본도 바뀌죠.

비유가 깨지는 곳 바로가기는 아이콘에 화살표라도 붙지만 코드에서는 구분이 안 보여요. ==는 값만 비교하니 같은 객체인지는 is로 확인하고, 안쪽이 모두 불변이면 얕은 복사로도 충분해요.

얕은 복사(shallow copy)는 바깥 컨테이너만 새로 만들고 안에 든 객체는 원본과 같은 객체를 가리킨다. 깊은 복사(deep copy)는 안쪽 객체까지 재귀적으로 새로 만든다. 중첩된 리스트·딕셔너리를 복사한 뒤 원본이 같이 바뀌는 버그의 원인이 대부분 이 차이다.

import copy
 
orig = [ [1, 2], [3, 4] ]
shallow = orig.copy()          # list(orig), orig[:] 도 얕은 복사
deep = copy.deepcopy(orig)
 
shallow[0].append(99)
orig        # [ [1, 2, 99], [3, 4] ]  ← 안쪽 리스트를 공유
deep        # [ [1, 2], [3, 4] ]

==와 is

  • ==는 값이 같은지 비교한다(__eq__)
  • is는 같은 객체인지 비교한다. id(a) == id(b)와 같다
  • None 비교는 is None으로 한다. 작은 정수·짧은 문자열은 인터프리터가 객체를 재사용해 is가 우연히 참일 수 있으니, 값 비교에 is를 쓰지 않는다
a = [1, 2]; b = [1, 2]; c = a
a == b   # True  (값이 같다)
a is b   # False (다른 객체)
a is c   # True  (같은 객체를 가리키는 다른 이름)

언제 무엇을

  • 변수에 대입하는 것(c = a)은 복사가 아니라 이름을 하나 더 붙이는 것이다
  • 안쪽이 모두 불변(숫자·문자열·튜플)이면 얕은 복사로 충분하다
  • 중첩된 가변 객체를 독립적으로 고쳐야 하면 깊은 복사. 대신 느리고, 파일 핸들처럼 복사할 수 없는 객체가 섞이면 실패한다
  • 애초에 고치지 않고 새 값을 만드는 방식으로 쓰면 복사 고민이 줄어든다. 튜플·frozenset·불변 데이터클래스(frozen=True)를 쓴다

자바스크립트의 전개 문법(spread syntax, {...obj})과 structuredClone도 같은 구분을 가진다. 얕은 병합이 보안 문제로 이어지는 예는 프로토타입 오염, 함수 기본값이 공유되는 문제는 가변 기본 인자 함정, 불변 값의 장점은 값 객체와 React 상태 갱신의 불변 업데이트를 본다.

출처: copy 모듈 문서 · Python 튜토리얼: More on Conditions(is·==)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 파이썬 클래스 기초

    파이썬 클래스는 데이터 속성(attribute)과 메서드를 묶은 타입이고, 클래스를 호출해 인스턴스(instance)를 만든다. 메서드의 첫 매개변수 self가 호출한 인스턴스 자신이며, 호출할 때는 파이썬이 자동으로 채워 넘긴다.

  • 파이썬의 선 (PEP 20)

    팀 피터스가 정리한 파이썬 설계 철학 19줄. 명시성, 단순함, 가독성을 앞세운다.

  • 파이썬 스코프 (LEGB)

    파이썬은 이름을 찾을 때 Local → Enclosing → Global → Built-in 순서로 스코프를 뒤진다. 앞 글자를 따 LEGB(Local, Enclosing, Global, Built-in) 규칙이라 부른다. 함수 안에서 만든 변수는 그 함수 안에서만 살고, 바깥 함수의 변수는 안쪽 함수가 읽을 수 있다.

  • 언어적 안티패턴

    이름, 타입, 주석이 말하는 것과 코드가 실제로 하는 일이 어긋나는 것. 읽는 사람을 잘못된 추측으로 이끈다.

  • 최소 재현

    버그가 여전히 일어나는 가장 작은 코드와 조건을 만드는 것. 원인을 좁히고, 테스트로 고정하고, 남에게 묻기 쉬워진다.

보기 옵션