얕은 복사와 깊은 복사 (Shallow / Deep Copy)

코딩Python
읽는데 6분 소요
처음 쓰여진 날: 2026-05-16
마지막 수정일: 2026-05-16
조회수:

요약

Python 리스트의 얕은 복사([:])와 깊은 복사(copy.deepcopy())의 차이를 다이어그램과 함께 정리합니다. is와 == 비교, += 제자리 수정 함정, 26년1회 기출(python_2026-1_20) 추적까지 정보처리기사 실기에 필요한 핵심을 다룹니다.

얕은 복사와 깊은 복사 핵심 정리

개념설명예시
얕은 복사바깥 리스트만 새로 만들고, 안쪽 요소는 원본과 공유b = m[:]
깊은 복사안쪽 요소까지 모두 새로 만듦b = copy.deepcopy(m)
is 연산자두 변수가 같은 객체(같은 주소)를 가리키는지 비교a is b
== 연산자값이 같은지 비교 (객체 구분 아님)a == b
+= / extend리스트 자체를 제자리에서 늘림 (공유 객체에 영향)b[0] += [99]
import copy깊은 복사 함수가 들어 있는 표준 라이브러리copy.deepcopy(m)

얕은 복사란? 심화

[[1], [2], [3]]처럼 리스트 안에 리스트가 있을 때, 밖에서 여러 개를 감싸고 있는 리스트를 바깥 리스트, 그 안에 들어 있는 각 리스트를 안쪽 리스트라고 합니다.

슬라이싱은 항상 새 리스트를 만들어 반환합니다. 결과를 그냥 잘라서 보여주는 게 아니라, 잘라낸 요소를 담을 리스트를 메모리에 새로 만들어서 돌려줍니다. 그래서 b = m[:]처럼 전체 범위로 슬라이싱하면 바깥 리스트(1층)만 새로 만들어지고, 안쪽 리스트(2층)는 원본과 같은 것을 그대로 가리킵니다. 겉(1층)만 복사하고 속(2층)은 공유하므로 이를 얕은 복사(shallow copy) 라고 합니다.

바깥만 복사, 안쪽은 공유

python
코드 하이라이팅 중...

is1==(값 비교)과 달리 두 변수가 같은 객체(같은 주소)를 가리키는지 비교합니다.

  • bm은 서로 다른 바깥 리스트입니다. b.append(...)처럼 바깥 리스트에 요소를 추가해도 m에는 영향이 없습니다.
  • 그러나 b[0]m[0]똑같은 하나의 안쪽 리스트를 가리킵니다. b[0]을 제자리에서 수정하면 m[0]도 함께 바뀝니다.

append+=가 어떻게 다른지 비교해보면 차이가 명확해집니다.

python
코드 하이라이팅 중...
m과 b의 바깥 리스트는 서로 다른 주소(200, 250)이지만 안쪽 리스트(300, 400, 500)는 공유되는 모습
바깥 리스트는 각자 새로 만들어지고(주소 200 vs 250), 안쪽 리스트는 같은 주소를 공유합니다. 그래서 m is b는 False, m[0] is b[0]은 True가 나옵니다.

공유된 안쪽 리스트는 +=가 양쪽을 바꿉니다 심화

리스트 +=는 가리키던 리스트를 제자리에서 늘리는 동작입니다. 새 리스트를 만들지 않고 extend()와 같이 기존 리스트 뒤에 덧붙입니다. 얕은 복사로 안쪽 리스트가 공유된 상태에서 이 동작이 일어나면 양쪽이 함께 변하는 함정이 생깁니다.

  1. b[1] += b[0]을 실행하면 b[1].extend(b[0])처럼 b[1]이 가리키던 안쪽 리스트가 제자리에서 늘어납니다.
  2. m[1]도 같은 안쪽 리스트를 공유하고 있으므로, m[1]도 함께 바뀝니다.
python
코드 하이라이팅 중...
b[1] += b[0] 실행 전후 비교 — 안쪽 주소 400이 제자리에서 [2, 1]로 확장되고 공유 때문에 m[1]도 함께 변함
바깥 리스트 주소(200, 250)는 그대로이지만, 안쪽 리스트(주소 400)가 제자리에서 [2, 1]로 늘어납니다. m과 b가 같은 안쪽 리스트를 공유하고 있기 때문에 m[1]도 함께 변합니다.

깊은 복사 — copy.deepcopy() 심화

안쪽 리스트까지 전부 새로 만들고 싶다면 깊은 복사(deep copy) 를 사용합니다. import copy2로 파이썬 내장 복사 도구 모음을 불러온 뒤 copy.deepcopy()를 호출합니다.

python
코드 하이라이팅 중...
복사 방법바깥 리스트안쪽 요소
b = m같은 객체 (복사 아님)같은 객체
b = m[:]새 객체같은 객체 (공유)
b = list(m)새 객체같은 객체 (공유)
b = copy.deepcopy(m)새 객체새 객체

정보처리기사 실기 기출 문제


Footnotes

  1. is==(값이 같은지)과 다릅니다. is와 is not은 두 변수가 같은 주소를 가리키는지 확인합니다. 값이 같아도 별개로 만든 리스트라면 is는 False를 반환합니다.

  2. import copy는 파이썬 표준 라이브러리의 copy 모듈을 불러옵니다. 이 모듈에는 copy()(얕은 복사)와 deepcopy()(깊은 복사) 함수가 들어 있습니다.


얕은 복사와 깊은 복사 (Shallow / Deep Copy) | 정처기 감자