Python의 Dictionary타입은 Key, Value값을 가지는데, 이때 Key는 Immutable, Value는 Mutable 한 값을 가진다.
전에 Immutable과 Mutable의 차이에 대해 공부한 적 있었는데, 오랜만에 보니 어렴풋이 '바꿀 수 없는 값 / 바꿀 수 있는 값' 정도로만 기억이 나서 다시 공부하고 기록을 남겨보려고 한다.
먼저 Mutable한 객체와 Immutable한 객체엔 어떤 것이 있는지 표로 살펴보자.
구분 | Type |
Immutable | int, float, string, tuple, bool |
Mutable | list, dict, set |
Immutable
Python에서 Immutable한 객체는 '수정이 불가능 한 타입'을 의미한다.
코드로 바로 살펴보도록 하자.
a = 'hello'
print(f'a의 주소값: {id(a)}')
a = 'hello2'
print(f'a의 주소값: {id(a)}')
변수 a는 string을 담는 객체이다. 따라서 객체 a는 immutable하다.
Immutable하기 때문에 값을 수정하면, 새 주소(3632)에 새 값이 생성되고 a는 새 주소를 가리키게 된다.
이때 기존 주소(3504)는 아무 객체도 자신을 참조하지 않게 되므로 가비지 컬렉터에 의해 자동으로 메모리에서 소멸한다.
Mutable
Mutable은 '수정이 가능한 객체'를 의미한다. 예제로 살펴보자.
a_list = [1, 2]
print(f'a_list의 주소값: {id(a_list)}, a_list: {a_list}')
a_list[0] = 3
print(f'a_list의 주소값: {id(a_list)}, a_list: {a_list}')
변수 a_list는 list를 담는 객체이다. 따라서 객체 a_list는 mutable하다.
Mutable하기 때문에 값을 수정하면, 값이 바뀌어도 주소 값은 그대로 유지된다.
그렇다면 다음 코드의 결과는 어떻게 될까?
a_list = [1, 2]
print(f'a_list의 주소값: {id(a_list[0])}, a_list: {a_list}')
a_list[0] = 3
print(f'a_list의 주소값: {id(a_list[0])}, a_list: {a_list}')
결과는 다음과 같다.
a_list[0]의 주소값이 달라진다!
처음엔 list는 mutable한데 왜 주소값이 달라지는건가 싶었다.
그런데 파이썬에서는 다음과 같이 값을 참조한다.
a_list의 주소는 그대로지만, a_list[0]이 참조하는 int 값(immutable)이 바뀌면서 다른 주소를 가리키게되는 것이다.
'Python' 카테고리의 다른 글
[Python Framework] 파이썬 프레임워크와 웹서버 연동 - CGI, WSGI, ASGI 차이 (0) | 2023.06.16 |
---|---|
[Django] 테스트 코드 작성해보기 (0) | 2023.06.03 |
[Flask] MVC pattern (0) | 2023.05.06 |
[Python] Set과 List의 시간 복잡도 차이 (0) | 2023.05.04 |