객체의 복사 종류 : copy, sallow copy, deep copy
정확한 이해 후 사용 → 프로그래밍 개발 중요(문제 발생 요소)
Call by value, Call vy Reffernce, Call by Share
a_list = [1, 2, 3, [4, 5, 6], [7, 8, 9]]
b_list = a_list
print(id(a_list))
print(id(b_list))
b_list[2] = 100
print(a_list)
print(b_list)
위 id와 밑의 print는 같은 값이 나온다. 즉 100으로 바꾸어도 둘 다 100으로 바귄 값이 나온다. 이유는 call by reference, 즉 같은 참조 데이터를 공유하는 부분을 바꾸었기 때문에 참조 주소가
우리는 직접 A와 B 리스트에 따로 할당 같은것 같아 보여도 이는 다른 형태로 사용해야한다.
mutable형 같은 경우 조심해서 사용해야한다.
# ex2 - shallow copy
import copy
c_list = [1, 2, 3, [4, 5, 6], [7, 8, 9]]
d_list = copy.copy(c_list)
print(id(c_list))
print(id(d_list))
d_list[1] = 100
print(c_list) # [1, 2, 3, [4, 5, 6], [7, 8, 9]]s
print(d_list) # [1, 100, 3, [4, 5, 6], [7, 8, 9]]
d_list[3].append(1000)
d_list[4][1] = 10000
print(c_list) # [1, 2, 3, [4, 5, 6, 1000], [7, 10000, 9]]
print(d_list) # [1, 100, 3, [4, 5, 6, 1000], [7, 10000, 9]]
리스트 안에 중첨 리스트나 중첩 셋 같은 경우는 call by refrence이기 때문에, 이 값은 참조되어 있는 다른 값도 수정이 될 수 있다. 이러니 주의를 요하는 바이다.
# ex3 - Deep Copy
e_list = [1, 2, 3, [4, 5, 6], [7, 8, 9]]
f_list = copy.deepcopy(e_list)
print(id(e_list))
print(id(f_list))
f_list[3].append(1000)
f_list[4][1] = 10000
print(e_list) # [1, 2, 3, [4, 5, 6], [7, 8, 9]]
print(f_list) # [1, 2, 3, [4, 5, 6, 1000], [7, 10000, 9]]
내부까지 복사를 깊게 해준다.
어떤게 좋은지는 아니지만 메모리를 더 많이 먹을 수 있어서 사용 방법에 따라서 다르게 만들어야한다.