본문 바로가기
데이터분석

python 복사 단순 객체복사 vs shallow copy vs deep copy

by 블쭌 2020. 10. 19.
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

댓글