기계는 거짓말하지 않는다

Python 깊은 복사, 얕은 복사 (Shallow Copy, Deep Copy) 본문

Python

Python 깊은 복사, 얕은 복사 (Shallow Copy, Deep Copy)

KillinTime 2023. 2. 12. 22:05

Python의 list 복사를 예시로 들 수 있다.

얕은 복사(Shallow Copy)는 list 뿐 아니라 mutable 객체 모두 문제가 된다.

Docs: Python copy module

 

copy — Shallow and deep copy operations

Source code: Lib/copy.py Assignment statements in Python do not copy objects, they create bindings between a target and an object. For collections that are mutable or contain mutable items, a copy ...

docs.python.org

List 초기화

# 2차원 list 10행 5열 생성, 초기화
arr = [[0] * 5] * 10
print(arr)

겉보기엔 문제없어 보이지만 값을 변경하거나 추가할 경우 문제가 있다.

arr[0][0] = 100
print(arr)

arr[n][0]의 값이 모두 100이 된 것을 볼 수 있다.

위와 같은 방법은 같은 reference를 복사해오는 것이다.

# 2차원 List Comprehension 10행 5열 생성, 초기화
arr = [[0 for c in range(5)] for r in range(10)]
print(arr)
arr[0][0] = 100
print(arr)

위는 List Comprehension을 이용한 방법이다.

List Slicing

위의 예제와 비슷하다.

# 3차원 임의 list 생성
arr = [[[1, 2, 3, 4], [5, 6, 7, 8]]]
temp_arr = arr[0][1:3]
temp_arr[0][0] = 100
temp_arr[0][1] = 200

print(arr)
print(temp_arr)

Deep Copy

깊은 복사(Deep Copy)는 copy 모듈의 deepcopy method를 이용할 수 있다.

from copy import deepcopy

arr = [[[1, 2, 3, 4], [5, 6, 7, 8]]]
temp_arr = deepcopy(arr[0][1:3])
temp_arr[0][0] = 100
temp_arr[0][1] = 200

print(arr)
print(temp_arr)

Comments