728x90
코드를 짜다보면 객체 복사를 하는 경우가 많다
아마 이 글을 읽는 사람은 deep copy의 존재를 알고있기 때문에 들어왔는데
복사의 개념이 머리속에 없는 사람들은 단순 객체 복사만을 사용하고 있는 경우가 많을 것이다.
1. 단순 객체 복사
a = [x for x in range(10)]
b = a # shallow copy
print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b[0] = 10
print(b) # [10, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a) # [10, 1, 2, 3, 4, 5, 6, 7, 8, 9]
변수 b에 a를 그냥 바로 담았다.
b의 값을 변경하는 경우 원본 데이터 a도 바뀌어버렸다.
a와 b가 동일한 객체를 참조하기 때문이다.
c = 1
d = c # shallow copy
d = 4
print(c) # 1
print(d) # 4
참고로 list와 같은 변경가능한 객체일때만 값이 바뀐다.
숫자나 문자열 같은 경우는 변하지 않는다
2. 얕은 복사(shallow copy)
import copy
a = [1, [2, 3]]
b = copy.copy(a) # shallow copy
b[0] = 4
print(b) # [4, [2, 3]]
print(a) # [1, [2, 3]]
b[1][0] = 4
print(b) # [4, [4, 3]]
print(a) # [1, [4, 3]]
shallow copy를 하는 경우 a와 b는 다른 객체이기 때문에 값을 변경해도 원본 데이터에 반영이 되지 않는다.
그러나 원본 데이터 안의 즉 list안에 list의 값을 변경했는데 원본 데이터에 영향을 주었다.
내부 list는 같은 객체를 참조하기 때문이다.
3. 깊은 복사(deep copy)
import copy
a = [1, [2, 3]]
b = copy.deepcopy(a) # shallow copy
b[0] = 4
print(b) # [4, [2, 3]]
print(a) # [1, [2, 3]]
b[1][0] = 4
print(b) # [4, [4, 3]]
print(a) # [1, [2, 3]]
deep copy를 하는경우 list안의 list의 값을 변경하더라도 원본 데이터에 영향을 주지 않는다.
728x90
'데이터분석' 카테고리의 다른 글
RMSE, Grid Search python 구현 (0) | 2020.11.12 |
---|---|
Logistic Regression (0) | 2020.11.12 |
seaborn 시각화 python (0) | 2020.11.12 |
데이터 전처리 python (0) | 2020.11.12 |
Python fire package (0) | 2020.10.19 |
댓글