정리 조금/Basics

Deep Copy & Shallow Copy

Turtle0105 2024. 3. 11. 22:08

Intro

코딩을 하다보면 자주 객체를 복사하게 된다. 그런데 Python에서 가끔 복사 된 객체를 바꾸었더니, 원본도 같이 바뀌는 이상한 현상이 발생하기도 한다. (아래 참고)

import copy

# 원본 리스트
original_list = [1, 2, [3, 4]]

# 복사
copied_list = original_list

# 복사본의 수정
copied_list[2].append(5)

# 결과
print(original_list)  # [1, 2, [3, 4, 5]]
print(copied_list)  # [1, 2, [3, 4, 5]]

이유는 바로 나도 모르게 Shallow copy를 사용했기 때문이다.

Shallow Copy

Shallow copy란 원본 객체와 복사본 객체 모두 같은 내부 객체를 참조하게 되는 상황을 말한다. 포인터 느낌으로 생각하면 쉽다. 새로운 인스턴스를 생성하지 않기 때문에 상대적으로 빠르다.

import copy

# 원본 리스트
original_list = [1, 2, [3, 4]]

# Shallow copy 생성
shallow_copied_list = copy.copy(original_list)

# 복사본의 수정
shallow_copied_list[2].append(5)

# 결과
print(original_list)  # [1, 2, [3, 4, 5]]
print(shallow_copied_list)  # [1, 2, [3, 4, 5]]

그렇다면, 독립적으로 복사본과 원본을 사용하려면 어찌해야 하는가? Deep copy를 사용하면 된다.

Deep Copy

Deep Copy는 새로운 메모리 공간에 내용을 복사한다. 데이터 자체를 통째로 복사하여 상대적으로 시간이 걸린다.

import copy

# 원본 리스트에 내부 리스트 포함
original_list = [1, 2, [3, 4]]

# Deep copy 생성
deep_copied_list = copy.deepcopy(original_list)

# 복사본의 수정
deep_copied_list[2].append(5)

# 결과
print(original_list)  # [1, 2, [3, 4]]
print(deep_copied_list)  # [1, 2, [3, 4, 5]]

Outro

Shallow copy와 Deep copy의 가장 큰 차이점은 복사본과 원본 두 객체가 완전히 독립적인 메모리를 차지하는가 이다.

'정리 조금 > Basics' 카테고리의 다른 글

Tanimoto Coefficient  (0) 2024.05.02
parquet  (0) 2024.04.22
Macro & Micro Averaging  (3) 2024.02.29
Inner & Outer Product  (0) 2024.02.15
Internet Protocol  (0) 2024.02.14