얕은 복사와 깊은 복사 (Shallow / Deep Copy)
선수학습(1개)
요약
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) 라고 합니다.
바깥만 복사, 안쪽은 공유
is1는 ==(값 비교)과 달리 두 변수가 같은 객체(같은 주소)를 가리키는지 비교합니다.
b와m은 서로 다른 바깥 리스트입니다.b.append(...)처럼 바깥 리스트에 요소를 추가해도m에는 영향이 없습니다.- 그러나
b[0]과m[0]은 똑같은 하나의 안쪽 리스트를 가리킵니다.b[0]을 제자리에서 수정하면m[0]도 함께 바뀝니다.
append와 +=가 어떻게 다른지 비교해보면 차이가 명확해집니다.

공유된 안쪽 리스트는 +=가 양쪽을 바꿉니다 심화
리스트 +=는 가리키던 리스트를 제자리에서 늘리는 동작입니다. 새 리스트를 만들지 않고 extend()와 같이 기존 리스트 뒤에 덧붙입니다. 얕은 복사로 안쪽 리스트가 공유된 상태에서 이 동작이 일어나면 양쪽이 함께 변하는 함정이 생깁니다.
b[1] += b[0]을 실행하면b[1].extend(b[0])처럼b[1]이 가리키던 안쪽 리스트가 제자리에서 늘어납니다.m[1]도 같은 안쪽 리스트를 공유하고 있으므로,m[1]도 함께 바뀝니다.
![b[1] += b[0] 실행 전후 비교 — 안쪽 주소 400이 제자리에서 [2, 1]로 확장되고 공유 때문에 m[1]도 함께 변함](/_next/image?url=%2Fcoding%2Fpython%2Farray%2Fshallow-copy-iadd-flow.webp&w=3840&q=75)
깊은 복사 — copy.deepcopy() 심화
안쪽 리스트까지 전부 새로 만들고 싶다면 깊은 복사(deep copy) 를 사용합니다. import copy2로 파이썬 내장 복사 도구 모음을 불러온 뒤 copy.deepcopy()를 호출합니다.
| 복사 방법 | 바깥 리스트 | 안쪽 요소 |
|---|---|---|
b = m | 같은 객체 (복사 아님) | 같은 객체 |
b = m[:] | 새 객체 | 같은 객체 (공유) |
b = list(m) | 새 객체 | 같은 객체 (공유) |
b = copy.deepcopy(m) | 새 객체 | 새 객체 |
정보처리기사 실기 기출 문제
Footnotes
-
is는==(값이 같은지)과 다릅니다. is와 is not은 두 변수가 같은 주소를 가리키는지 확인합니다. 값이 같아도 별개로 만든 리스트라면is는 False를 반환합니다. ↩ -
import copy는 파이썬 표준 라이브러리의copy모듈을 불러옵니다. 이 모듈에는copy()(얕은 복사)와deepcopy()(깊은 복사) 함수가 들어 있습니다. ↩