Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- math
- HashTable
- Depth-first Search
- hash table
- list
- 재귀
- Medium
- DP
- recursive
- leetcode
- dfs
- linked list
- Binary
- binary tree
- backtracking
- tree
- binary search
- 리트코드
- Array
- 쉬움
- 미디움
- two pointers
- Python
- 문자열
- easy
- matrix
- 중간
- string
- 이진트리
- sorting
Archives
- Today
- Total
부부의 코딩 성장 일기
얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy) 본문
얕은 복사란?
- 원본 객체의 요소들을 새로운 객체로 복사하지만, 내부에 있는 객체들은 참조로 복사
- 내부 객체는 그래서 동일한 객체를 가리키게 됨
- 아래 예제를 보면
- 단순히 list를 copy한 후, 기존 리스트(original_list)를 변경하면,
- 얕은 복사를 한 shallow_copy도 값이 변하게 됨.
- "내부 객체가 동일한 객체 - 같은 주소"를 가리키고 있기 때문!
original_list = [1, [2, 3], 4]
shallow_copy = original_list.copy()
# 얕은 복사 후 내부 리스트의 참조는 동일함
original_list[1][0] = 99
print(original_list) # 출력: [1, [99, 3], 4]
print(shallow_copy) # 출력: [1, [99, 3], 4]
깊은 복사란?
- 반면, 깊은 복사는 원본 객체와 그 내부에 있는 모든 객체를 완전히 복사하여, 새로운 객체가 만들어지고,
- 이는 원본 객체와는 완전히 독립적인 복사본이 됨.
- 아래의 예제를 보면,
- deepcopy()를 수행했을 시, 기존 리스트(original_list)를 수정하여도, 기존리스트를 깊은 복사한 deep_copy는 변경이 되지 않음을 알 수 있음.
- 즉, 원본 객체 및 그 하위 객체들을 모두 새로운 복사본으로 만들어내어, 완전히 독립적인 구조를 갖게 됨.
import copy
original_list = [1, [2, 3], 4]
deep_copy = copy.deepcopy(original_list)
# 깊은 복사 후 내부 리스트의 참조는 독립적임
original_list[1][0] = 99
print(original_list) # 출력: [1, [99, 3], 4]
print(deep_copy) # 출력: [1, [2, 3], 4]
Deep Copy의 구현?
- https://leetcode.com/problems/clone-graph/ 이 문제를 풀다가, Deep Copy와 Shallow Copy의 명확한 차이를 몰라서 헤맸었다.
- python의 deepcopy()함수는 객체와 그 객체 내부의 모든 객체까지 깊은 복사를 수행하는 방식으로 구현이 된다. Python의 copy모듈은 C로 구현되어 있어서 성능상 이점을 가지고 있다고 한다.
어떤 데이터타입에서 고려가 필요할까?
- 만약 객체가 immutable한 데이터 타입이라면 (ex. int, float, str, tuple 등) 생성 후 내부의 값을 변경할 수 없기 때문에 참조를 공유하더라도 문제가 생기지 않는다.
- 다만, List나 Dictionary같은 데이터형태의 경우, mutable한 데이터타입이기 때문에, copy시 유의할 필요가 있다.
'Python > Fundamentals' 카테고리의 다른 글
Python coroutine 코루틴, asyncio 라이브러리 (0) | 2024.03.01 |
---|---|
Python 추상화와 abc 라이브러리 (0) | 2024.02.29 |
Python에서 __init__.py 의 역할 (0) | 2024.02.24 |
데코레이터(Decorator) (0) | 2024.02.19 |