JAMONGPROJECT

불변성 / 얕은 복사 / 깊은 복사 본문

기타/Python

불변성 / 얕은 복사 / 깊은 복사

JAMONGPROJECT 2023. 2. 21. 09:19

불변성(immutable)

 

얕은 복사 (Shallow Copy)와 깊은 복사 (Deep Copy)를 이해하려면

가변성, 불변성(mutable, immutable)부터 이해해야한다.

 

변수에 원시값이 할당된다면 (ex : string, number, boolean ...)

a = 100

a는 100이라는 값의 메모리 위치를 참조한다.

이후에 a의 값이 변경된다면,

a = 4

a가 가리키는 위치는

100의 메모리 위치에서 4의 메모리위치로 변경된다.

 

이러한 경우를 '재할당'이라고 부르며

재할당은 변수가 값을 담을 공간

즉, 메모리 위치의 변경이 일어난다.

 

왜냐하면, 100이라는 값은 number로 불변성(immutable)을 가지고 있기 때문에

변수 a의 값을 변경할 수 없으므로

100이라는 값의 메모리 위치에서

4라는 값의 메모리 위치로 이동을 하는 것이다.

 

 

얕은 복사(Shallow Copy)

 

만약 변수 a가

a = [1,2,3]

이라는 list의 형태를 가지게 된다면

list, set, dictionary와 같은 값의 형태는 가변성(mutable)을 지니고 있기 때문에

a = [1, 2, 3]
print(id(a))
>>> 4393788808

a[0] = 5
print(a)
>>> [5, 2, 3]
print(id(a))
>>> 4393788808

위와 같이 내부값을 변경하더라도 id값이 변하지 않는다.

 

그러나 이중 리스트와 같은 형태에서는 문제가 발생하는데

a = [[1,2], [3,4]]
b = a[:]
print(id(a))
>>> 4395624328
print(id(b))
>>> 4396179592
print(id(a[0]))
>>> 4396116040
print(id(b[0]))
>>> 4396116040

b를 슬라이스를 이용해 a를 복제한다면

a, b 각각의 id값은 다르지만

리스트 안의 리스트의 값은 같은 id를 참조하고 있음을 알 수 있다.

 

깊은 복사(Deep Copy)

 

copy 모듈을 이용해서 copy.deepcopy() 메소드를 사용해 깊은 복사를 하면

import copy
a = [1,2,3,4]
b = copy.deepcopy(a)

a와 b는 완전히 다른 메모리 위치를 가리키는 list가 된다.

Comments