데브코스를 들으면서 한번 언급이 되었는데 잘 모르고 있어서 찾아본 내용이다. 매우 중요한 사항이 많아 별도의 글로 정리하였다.
오늘의 주제 : mutable vs immutable / shallow copy vs deep copy
변수의 개념
기본적으로 변수는 객체를 가리킨다.
num = 10이라고 하면,
컴퓨터 메모리에 10이 저장되고, num이라는 변수는 10이라는 정수형 객체를 가리킨다.
immutable
Immutable한 객체의 예시는 number, string, tuple등이 있다.
값이 변하지 않는 속성의 객체라는 의미인데. 다음을 통해 이해해보자.
x = 1
y = x
y += 3
print(x) # 1 출력
print(y) # 4 출력
위와 같은 상황을 고려하자. 세번째에서 y값을 변화시켜도, x는 1을 가리키고 y는 4를 가리킨다.
여기서 주의해야 하는 점은, y = x가 호출될때는 같은 곳을 가리키다가 immutable한 성질에 의해, y의 값이 변경될 때, y를 가리키는 주소가 변경된다.
mutable
Mutable한 객체의 예시로는 리스트, 딕셔너리, Numpy의 배열이다. 별표 100개다. 매우 중요하다.
먼저 다음 상황을 보자.
x = [1, 2, 3]
y = x
y.append(4)
print(x)
print(y)
실행 결과는 다음과 같다.
아니 ? y만 분명히 append 했는데 x도 바꾸고 있다! 리스트는 mutable하기에 y.append로 변경해도 x와 y가 같은 주소를 가지고 있어서 최종 결과가 같게 나오는 것이다.
그러면 실제 x를 유지한 상태로 y로만 복사해서 원본과 복사본을 따로 가지고 싶은 경우가 있을 것이다. 어떻게 해야 할까?
shallow copy vs deep copy
위의 문제를 해결하기 위해서는 shallow copy와 deep copy에 대한 개념을 알아야 한다. 이 개념을 모르면 상당히 고생한다. (실제로 프로그래머스 입학시험 코테 때 겪었던 문제이다. 한참을 찾아본 끝에 문제를 해결하였다...)
우선, shallow copy(얕은 복사)란 주소만 복사되는, 즉 동일 객체를 참조하게 되는 것이다. 따라서 mutable한 객체로 일반적인 복사를 하게 될 경우, 위와 같은 문제가 발생하게 된다.
반면 deep copy를 하게 될 경우, 메모리에 아예 새로운
이제 앞에서 본 리스트 문제로 돌아오자. 리스트 복사를 위해서는 deep copy를 해야 한다. 왜냐? mutable한 객체는 shallow copy가 되어버려서.
따라서, 다음과 같이 처리하면 된다.
다음과 같이, 내장함수인 copy를 할 경우 deep copy를 한다......?
잠깐만! 이중 리스트의 상황을 보자.
이중 리스트의 상황은 어떤지 확인해보자.
어라..?
리스트 a[0]에 접근할때는 단일 리스트 상황이긴 해서, copy메서드로도 값이 바뀌진 않았는데 이중리스트로 접근하는 순간 copy만으로는 값의 변동을 막을 수 없다.
따라서 다중 리스트일 경우는 반드시 deepcopy로 사용해야 한다.
'Archive > 프로그래밍 언어' 카테고리의 다른 글
[기본이론] defaultdict()의 활용법 (0) | 2021.04.29 |
---|---|
[자료] Python으로 배우는 자료구조 (4) Heap (0) | 2021.04.21 |
[자료구조] Python으로 구현하는 자료구조 (3) Tree (0) | 2021.04.21 |
[자료구조] Python으로 구현하는 자료구조 (2) Stack & Queue (0) | 2021.04.20 |
[자료구조] Python으로 구현하는 자료구조 (1) Linked_list (0) | 2021.04.20 |