각 프로그래밍마다 다른 구조를 가지고 있다. 파이썬에서 다루는 가변형/ 불변형 변수와 shallow copy, deep copy 의 차이점을 배워보자.
중요한 부분이고, 놓치기 쉽다. 실수하기 쉬우니까 집중 ~!
파이썬에선 모든게 객체이다.
- 불변형 : int, float, string, unicode . . .
한번 선언하면 값을 바꿀 수 없다.- 가변형 : list, set, dictionary
언제든 값을 바꿀 수 있다.
객체의 복사 종류 : copy, shallow copy, deep copy
복사를 할 때, 객체가 call by value / call by reference / call by share 중 어떤지 따져야 한다.
a_list = [1,2,3, [4,5]]
b_list = a_list
print('ex 1>', id(a_list), id(b_list))
# 서로 같은 아이디 값을 참조하고 있다.
b_list[2]= 100
print('ex 1>', a_list, b_list)
b_list[3][0]= 100
print('ex 1>', a_list, b_list)
# a_list의 값도 바뀌었다.
일반 copy와 다른 점
- 복합 객체는 별도로 생성하지만, 그 안에 들어가는 내용은 같은 객체다.
- 즉 복합 객체(껍데기)만 복사하고, 내용은 동일한 객체라는 뜻이다. 따라서 리스트 내부에 있는 리스트까지 복사가 되지 않는다.
- 모듈을 import 해야 이용할 수 있다.
import copy
import copy
c_list = [1, 2, 3, [4, 5]]
d_list = copy.copy(c_list)
print('ex 2> ',id(c_list),id(d_list))
# 서로 다른 아이디값을 가진다. 어떤 데이터의 원본을 백업해놓고 사용하면 좋다.
d_list[1] = 100
print('ex 2>', c_list, d_list)
# 복사본만 수정이 됐다.
d_list[3][0]= 100
print('ex 2>', c_list, d_list)
# 띠용~~~ 리스트 내부에 잇는 리스트를 수정했더니 원본 리스트가 변경 되었다.
Shallow copy와 다른 점
- 복합 객체(껍데기) 복사는 물론 그 내용도 재귀적으로 복사해준다.
e_list = [1, 2, 3, [4, 5]]
f_list = copy.deepcopy(e_list)
print('ex 3> ',id(e_list),id(f_list))
# 서로 다른 주소 값을 가진다.
f_list[1] = 100
print('ex 3>', e_list, f_list)
# 복사본만 수정이 됐다.
f_list[3][0]= 100
print('ex 3>', e_list, f_list)
# 복사본만 수정이 됐다.
출처: 인프런 - 모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포 (Inflearn Original)