정처기 감자정처기 감자
Python자료구조

검색

검색어를 입력해 개념, 문제, 필기를 찾습니다.

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

코딩Python
읽는데 6분 소요
처음 쓰인 날: 2026-05-16
마지막 수정일: 2026-05-16
조회수: —
선수학습(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) 라고 합니다.

바깥만 복사, 안쪽은 공유

python
코드 하이라이팅 중…

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

  • b와 m은 서로 다른 바깥 리스트입니다. 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)새 객체새 객체
m[:]으로 2차원 리스트를 복사하면 함정에 빠집니다
[:]는 바깥 리스트만 새로 만들고 안쪽 요소는 공유합니다. 숫자나 문자열처럼 바꿀 수 없는 값이 들어 있으면 문제가 없지만, 리스트·딕셔너리처럼 내부를 수정할 수 있는 값이 들어 있으면 한쪽을 바꿔도 다른 쪽이 함께 바뀝니다. 2차원 리스트를 완전히 독립시키려면 copy.deepcopy()를 써야 합니다.

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

문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.

Footnotes

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

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


메가커피와 함께, 홈페이지 개선에 참여하세요! ☕
혹시 이용에 불편한 점이나 개선이 필요한 부분을 발견하셨나요? 댓글로 알려주시면 더 나은 감자가 될 수 있어요! 🥔 제보해주신 모든 분께 메가커피 기프티콘을 드립니다! (본인 이메일로 댓글 달아주셔야해요~)
후수학습(1개)
  • Python 제너레이터 표현식
정처기 감자정처기 감자

정보처리기사 합격
도와줄라고 하는 감자

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매
© 2025 재현기획개발. All rights reserved.
  • 정처기 감자의 시작
  • 업데이트 로그
  • 개인정보 처리방침
  • 이용약관
상호명 : 재현기획개발 / 주소: 서울특별시 영등포구 영등포로 150, 지하1층 108호 L145 가라지(당산동1가, 생각공장 당산) / 대표: 김재현 / 전화: 010-8158-7127 / 통신판매업신고: 제2025-서울영등포-1569호 / 이메일: contact@edugamja.com / 사업자등록번호: 573-51-00999