딥러닝·머신러닝/Python

Python Numpy Basic 7 (Shallow Copy, Deep Copy)

경이가 꿈꾸는 플랫폼 개발 2021. 10. 31. 17:51

1. Shallow Copy

view(), slicing 사용해서 새로운 array 객체 생성하면 얕은 복사가 된 것

기본적으로 Python에서 Copy는 Shallow : Python의 값들은 값들로서 존재하는 것이 아니고, 주소들로 존재함

주소를 복사한다고 생각하면 됨 → 참조하는 주소 안의 값들은 또 자체적으로 주소를 참조하고 있기 때문에 값 변경되면 복사한 곳에서도 같이 변경된다. 하지만 shape 변화는 영향 못줌. 

import numpy as np

a = np.arange(6)
b = a
id(b) == id(a)

# True

b.shape = 2, 3  # shape 변경   
a, b

# 둘 다 동일하게
# array([[0, 1, 2],
#        [3, 4, 5]])


a = np.arange(6).reshape(3, 2)
b = a.view()
id(a) == id(b)

# False

b.shape = 2, 3  # shape 변경   
a, b

# a는 
# array([[0, 1],
#        [2, 3],
#        [4, 5]])
# b는
# array([[0, 1, 2],
#        [3, 4, 5]])

id(a[0, 0]) == id(b[0, 0])

# True : 안에 값들은 각각 자신의 주소를 참조하고 있는 것

b = a[:, :]  # shallow copy 발생
id(a) == id(b)
id(a[0, 0]) == id(b[0, 0])

# False
# True

2. Deep Copy

완전하게 복사하는 것 (내부까지도 연동 안되고 별도의 사본이 만들어진 것)

a = np.arange(6).reshape(3, 2)
b = a.copy()
id(a), id(b)
b[0, 2] = 100
b, a

# False
# a는 안 바뀜