(Python) 얇은 복사와 깊은 복사
아래의 코드처럼 값을 대입하는 방식으로 값을 복사하게 되면 주소값도 똑같이 복사가 되게 된다. a_list와 b_list 모두 메모리가 동일하기 때문에 둘 중 어떠한 값을 변경해도 둘 다 값이 변경되게 된다.
a_list = [1, 2, 3, [4, 5, 6], [7, 8, 9]]
b_list = a_list
print('ex1 ->', id(a_list))
print('ex1 ->', id(b_list))
b_list[2] = 100
print('ex1 ->', id(a_list))
print('ex1 ->', id(b_list))
b_list[3][2] = 100 # list는 참조형이기 때문에 a와 b가 가리키고 있는 메모리가 같다.
#그렇기 때문에 둘 중 하나가 변경되면 둘 다 변경된다
print('ex1 ->', id(a_list))
print('ex1 ->', id(b_list))
"""
ex1 -> 139932265833544
ex1 -> 139932265833544
ex1 -> 139932265833544
ex1 -> 139932265833544
ex1 -> 139932265833544
ex1 -> 139932265833544
"""
얇은 복사
데이터를 얇은 복사를 하는 경우 주소값이 달라진다. 즉 원본값의 주소값과 복사본의 주소값이 달라진다는 것이다. 하지만 여기서 주의해야 할 점이 있다. 리스트의 경우를 살펴보자. copy를 통해서 list를 복사한 후 각각의 id값을 보면 서로 다른 메모리를 가리키고 있는 것을 알 수 있다.
실제로 d_list_[1] = 100
으로 값을 변경시키면 d_list의 값만 변경되는 것을 볼 수 있다. 하지만 이후에 d[3]과 d[4][1]
의 값을 변경하면 d_list와 c_list모두 변경되는것을 볼 수 있다. 왜그런가 하니 리스트의 경우 리스트 안에 존재하는 또다른 리스트들의 주소값은 동일하기 때문이다
즉, [[4,5,6],[7,8,9]] 4,5,6과 7,8,9의 원소값을 가지고 있는 리스트들의 주소값이 동일하다는 소리이다. 그렇기 때문에 저곳에 해당하는 값이 변경되면 두개의 리스트 값이 전부 바뀌게 된다. 이렇듯 가변형인 자료형에 대해서는 주의해야 한다. !
import copy
c_list = [1, 2, 3, [4, 5, 6], [7, 8, 9]]
d_list = copy.copy(c_list)
print('ex2 ->', id(c_list))
print('ex2 ->', id(d_list))
d_list[1] = 100 # 가리키고 있는 메모리가 다르기 때문에 d의 원소값만 변경된다
print('ex2 ->', c_list)
print('ex2 ->', d_list)
d_list[3].append(100000)
d_list[4][1] = 10000
print('ex2 ->', c_list)
print('ex2 ->', d_list)
"""
ex2 -> 139932265833864
ex2 -> 139932386600328
ex2 -> [1, 2, 3, [4, 5, 6], [7, 8, 9]]
ex2 -> [1, 100, 3, [4, 5, 6], [7, 8, 9]]
ex2 -> [1, 2, 3, [4, 5, 6, 100000], [7, 10000, 9]]
ex2 -> [1, 100, 3, [4, 5, 6, 100000], [7, 10000, 9]]
"""
깊은 복사
데이터를 깊은 복사하는 경우 주소값이 전부 완전히 달라진다. 즉 리스트 안에 리스트가 존재하더라도 모든 리스트들의 주소값이 변경되는 것이다. 아래의 코드를 살펴보자. e_list에 대해 깊은복사를 진행하였다. 이때 f_list와 e_list에는 동일한 주소값 없이 전부 다른 주소값을 할당해준다. 그렇기 때문에 서로의 변화에 영향이 없다
import copy
e_list = [1, 2, 3, [4, 5, 6], [7, 8, 9]]
f_list = copy.deepcopy(e_list)
print('ex3 ->', id(c_list))
print('ex3 ->', id(d_list))
f_list[3].append(100000)
f_list[4][1] = 1000
print('ex3 ->', e_list)
print('ex3 ->', f_list)
"""
ex3 -> 139932265833864
ex3 -> 139932386600328
ex3 -> [1, 2, 3, [4, 5, 6], [7, 8, 9]]
ex3 -> [1, 2, 3, [4, 5, 6, 100000], [7, 1000, 9]]
"""