Skip to main content

Command Palette

Search for a command to run...

[Python TIL] 얕은 복사(Shallow copy)와 깊은 복사(Deep copy)

리스트 복사와 reverse() 메서드의 함정

Published
2 min readView as Markdown
K

I'm currently learning Python and studying RAG (Retrieval-Augmented Generation).

오늘은 Python에서 리스트를 복사할 때 흔히 발생하는 실수를 다뤄보겠습니다.
리스트를 복사한 후 reverse()를 사용했는데, 원본 리스트까지 바뀌는 현상을 본 적이 있나요?

❌ 문제 코드

아래 코드를 실행하면 원본 리스트까지 뒤집혀버리는 문제가 발생해요.

string = list(input())
string_copy = string  # 얕은 복사 (shallow copy)
string_copy.reverse()
print(string, string_copy)

예를 들어, "hello"를 입력하면 기대한 출력은:

['h', 'e', 'l', 'l', 'o'] ['o', 'l', 'l', 'e', 'h']

인데, 실제로는:

['o', 'l', 'l', 'e', 'h'] ['o', 'l', 'l', 'e', 'h']

처럼 원본 리스트(string)까지 바뀌어버려요.


왜 이런 일이 발생할까? 🤔

string_copy = string얕은 복사(shallow copy) 로,
string_copystring동일한 리스트 객체를 가리키게 돼요.

즉, string_copy.reverse()를 호출하면 원본 리스트도 같이 뒤집히게 됩니다!


✅ 원본을 유지하는 해결 방법

원본 리스트를 유지하면서 새로운 리스트를 뒤집고 싶다면 깊은 복사(deep copy) 가 필요합니다.

🔹 방법 1: 슬라이싱 활용

string = list(input())
string_copy = string[:]  # 원본을 새로운 리스트로 복사
string_copy.reverse()
print(string, string_copy)

💡 [:] 슬라이싱을 사용하면 원본과 같은 요소를 가진 새로운 리스트가 생성됩니다.


🔹 방법 2: copy() 메서드 활용

string = list(input())
string_copy = string.copy()  # 새로운 리스트로 복사
string_copy.reverse()
print(string, string_copy)

💡 copy() 메서드도 리스트의 복사본을 생성해줍니다.


🔹 방법 3: reversed() 사용

string = list(input())
string_copy = list(reversed(string))  # 새로운 리스트로 변환
print(string, string_copy)

💡 reversed()는 원본을 수정하지 않고, 뒤집힌 새로운 iterator를 반환합니다.
이를 list()로 변환하면 원본이 유지된 채로 새로운 리스트를 만들 수 있습니다.


📝 정리

방법원본 유지속도가독성
[:]빠름직관적
.copy()빠름명확함
reversed()느림 (iterator 변환 필요)가장 깔끔

More from this blog

[Python 자료구조] Binary Tree(이진 트리) 개념과 배열

자료구조 중에서도 가장 자주 등장하고, 가장 중요한 트리 중 하나가 바로 이진트리(Binary Tree)이다.만약 자료구조 공부를 처음 시작했다면, 이진트리는 꼭 제대로 이해하고 넘어가야 할 핵심 개념이다. 그렇다면 이진트리는 도대체 어떤 구조이며, 왜 이렇게 중요할까? 🌳 이진트리란? 이진트리(Binary Tree)는 이름 그대로 자식 노드를 최대 두 개까지만 가질 수 있는 트리를 의미한다.자식 노드가 1개거나 0개일 수도 있지만, 최대...

Apr 8, 20253 min read

[Python 자료구조] Tree(트리) 구조

회사 조직도, 가계도, 또는 어떤 계층적인 구조를 표현할 때 자주 등장하는 그림이 있다. 바로 '트리 구조'이다. 그런데 이 구조를 처음 보면, "도대체 어디가 나무야?" 라고 생각할 수 있다. 하지만 나무를 거꾸로(180도 돌려서) 생각해보면 이해가 쉽다. 위쪽에 커다란 줄기(기둥)가 있고, 아래로 가지가 퍼져 나가는 모습과 아주 흡사하기 때문이다. 그래서 우리는 이런 구조를 트리(Tree) 구조라고 부른다. 🧩 트리(Tree)란 무엇인가...

Apr 8, 20253 min read

[Python 자료구조] Stack(스택)

스택 정의, 값 넣기/빼기 프로그래밍을 처음 접할 때 나오는 대표적인 자료구조 중 하나가 바로 스택(Stack) 이다. 이름만 들으면 어렵게 느껴질 수 있지만, 실제로는 우리 일상에서도 쉽게 찾아볼 수 있는 개념이다. 예를 들어 젠가(Jenga) 게임을 떠올려보자. 스택이란? 젠가로 이해하는 Stack의 원리 젠가 블럭을 하나씩 통에 넣고 꺼내는 상황을 상상해보자. 가장 최근에 넣은 블럭은 통의 가장 위에 쌓이게 된다. 그리고 꺼내고자 할 때...

Apr 7, 20253 min read

[Sql] 제약 조건과 무결성

SQL을 공부하다 보면 반드시 만나게 되는 용어들이 있다. 바로 기본키, 외래키, 무결성 제약 조건 같은 개념이다. 이 글에서는 이 용어들을 단순히 암기하는 게 아니라, 예시를 통해 자연스럽게 이해할 수 있도록 정리해보았다. 🎯 제약 조건이란? 제약 조건(Constraint)은 데이터베이스에 저장되는 데이터의 정확성과 신뢰성을 보장하기 위해 설정하는 규칙이다. ✅ 한 줄에 하나씩만 작성해야 하며, 테이블 생성 시 컬럼 옆에 정의하거나 AL...

Apr 7, 20253 min read

[Python TIL] Python에서 False와 True로 평가되는 값들

파이썬에서는 if 조건문이나 while 같은 컨트롤 흐름에서 자동으로 False로 간주되는 값들이 있다. 이걸 "Falsy 값" 또는 "Falsy Object" 라고 부른다. 이걸 알아두면 코드를 훨씬 깔끔하게 쓸 수 있다. 예를 들어, if not my_list: 같은 표현이 빈 리스트를 체크하는 데 쓰이기도 하기 때문이다. ⚠️ 파이썬에서 False로 평가되는 값들 (Falsy 값) 유형예시설명 숫자형0, 0.0, 0j정수, ...

Apr 6, 20252 min read

Code Compass

75 posts