이번 포스팅에서는 얕은복사 깊은 복사에 대해 알아보겠습니다.
우선 왜 이러한 복사를 사용하는지 부터 알아볼까요?
a = [1, 2, 3, 4, 5]
b = a
b[0] = 100
print(a)
output :
위 코드를 보면 알수 있듯이 int 자료형이 담긴 리스트 a를 b라는 변수값에 담았습니다.
이 말은 a, b 라는 꼬리표가 똑같은 메모리 공간을 사용하게 된다는 말입니다.
그렇기 때문에 우리가 바꾼 값은 b의 첫번째 값인데 최초 값인 a의 첫번째 값도 같이 바뀐 것을 알 수 있죠.
이런식의 작동방법은 메모리 효율성은 뛰어날 수 있으나,
원치않는 문제가 발생되기도 하죠.
이때 사용하는 것이 '복사' 입니다. 말그대로 값은 그대로 복사해서 쓰나 메모리는 따로 쓰겠다라는 말입니다.
복사에는 크게 두가지 복사가 있습니다. 얕은 복사, 깊은 복사죠.
얕은 복사
# 원소 데이터가 mutable 일경우
a = [1,2,3]
b = a[:] # 얕은 복사
b[0] = 8
print(a)
output :
위와 같이 [:] 이용하면 파이썬은 얕은 복사로 인식합니다.
ouput결과를 보시다시피 복사를 통해 다른 메모리공간을 쓰기 때문에 b값을 변경해도 a에는 영향을 끼치지 않죠.
복사가 완벽하게 되었는데 왜 얕은 복사이지 라고 궁금하실 분들도 있을텐데요.
바로 아래와 같은 경우 때문입니다.
a = [[1,2,3], [4,5,6], [7,8,9]]
b = a[:]
b[0][0] = 10
print(a)
output :
분명히 복사를 하였는데 값이 변경되었죠.
위 예와 어떤 차이가 보이시나요?
바로 리스트안에 있는 "원소의 데이터 타입"이 다르기 때문입니다.
첫번째 예에서는 원소의 데이터타입이 int 였다면 두번째 예시는 리스트입니다.
(int는 기본적으로 바꿀수 없는 값 즉 immutable이고 list는 바꿀 수 있는 값인 mutable형태의 데이터 타입입니다.)
(mutable, immutable 관련 설명 추천 포스팅)
즉, 다시 말하면 리스트안의 원소 값이 mutable 형태라면 얕은 복사라는 완벽하게 다른 메모리공간을 사용할수 없다는 거죠.
이러한 한계를 극복하기 위한것이 깊은 복사입니다.
얕은복사[넘파이]
a = np.array([[1,2,3], [4,5,6], [7,8,9]]) # ndarray형태로 변경
b = a[:]
b[0][0] = 10
print(a)
output :
a = np.array([[1,2,3], [4,5,6], [7,8,9]]) # ndarray형태로 변경
b = a.view()
b[0][0] = 10
print(a)
output :
넘파이에서도 파이썬 자체 문법과 비슷합니다. 슬라이싱을 통한 얕은 복사가 가능하구요.
넘파이 전용 메소드인 .view() 라는 메소드를 통해서도 얕은 복사가 가능하죠.
깊은 복사
파이썬에서 깊은 복사를 하기 위해서는 copy라는 모듈을 import 한뒤 deepcopy 메소드를 이용해야 합니다.
import copy
a = [[1,2,3], [4,5,6], [7,8,9]]
b = copy.deepcopy(a)
b[0][0] = 10
print(a)
output :
import numpy as np
a = np.array([[1,2,3], [4,5,6], [7,8,9]])
b = a.copy()
b[0][0] = 10
print(a)
output :
반면 넘파이에서는 .copy() 만 이용하면 깊은 복사가 됩니다.
넘파이에서는 .copy() 해도 깊은 복사가 되었지만 파이썬에서는 .copy()를 하면 얕은 복사만 된다는거 잊지 마세요!
a = [[1,2,3], [4,5,6], [7,8,9]]
b = a.copy()
b[0][0] = 10
print(a)
output :
이 글과 읽으면 좋은글
'머신러닝,딥러닝 > 넘파이,numpy' 카테고리의 다른 글
[넘파이 기초] np.repeat , np.tile (배열 반복 | array 복사) (0) | 2021.05.25 |
---|---|
[넘파이 기초] vstack | hstack | concatenate | dstack | stack 마스터 (4) | 2021.05.13 |
[넘파이 기초] bool ndarray로 인덱싱하기(np.nonzero, np.where) (0) | 2021.04.28 |
[넘파이 기초] 반올림, 올림, 버림 (0) | 2021.04.27 |
[넘파이 기초] axis, keepdims 마스터하기 (0) | 2021.04.23 |
댓글