Mutable과 Immutable

박지은·2023년 4월 6일
0
post-thumbnail

1.Mutable과 Immutable

파이썬에 변수 객체들은 크게 Mutable, Immutable로 나눌 수 있습니다. 그렇다면 이 가변객체와 불변 객체는 무엇일까요?

가변 객체
객체가 메모리에 할당 된 후, 저장된 값을 수정 가능한 객체
ex) list, dictionary, set

불변 객체
객체가 메모리에 할당 된 후, 저장된 값을 수정 불가능한 객체
ex) int, string, boolean, tuple

그런데 int형 변수가 불변 객체라면, 정수로 저장된 변수의 값을 어떻게 바꾸고 있었던 걸까요...?

각 객체가 값을 바꾸는 방식을 알아보기 전에, 파이썬에서 변수가 저장되는 과정에 대해 알아보겠습니다.


1-1. 변수의 저장 과정

Everything is Object in Python
파이썬은 C언어와 달리 변수는 객체 형태로 저장됩니다.

C언어의 변수 저장

int a=1
  1. int 4바이트 만큼의 메모리를 할당하고 a라는 이름을 붙입니다.
    컴퓨터는 a를 방금 할당한 메모리의 주소로 기억합니다.
  2. 변수 a의 자리에 1을 저장합니다.

C 언어의 경우 변수는 메모리에 바로 저장됩니다.
또한, 사용 종료와 동시에 소멸됩니다.

Python의 변수 저장

a=1
  1. 1 을 a 에 할당합니다.
  2. a 객체는 메모리의 힙 영역 저장됩니다.
  3. 변수 a는 a의 값이 저장된 객체의 가리킵니다.

1-2. 변수의 값 변경

그렇다면, 가변 객체와 불변 객체에서 변수의 값을 변경하면 어떻게 될까요?

불변 객체의 변수의 값을 수정할 경우

>>> a=1
>>> id(a)
4379265328
>>> a=2
>>> id(a)
4379265360

int로 할당된 변수의 값을 수정할 경우를 예로 들겠습니다.

a=1 일때와 a=2일때 변수에 저장된 객체의 메모리 주소 값이 다릅니다!

변수에 새로운 값을 저장할 경우 가리키는 객체가 달라지기 때문에 메모리 주소가 달라집니다.

그렇다면...
Q. 서로 다른 immutable 변수가 같은 값을 가지고 있다면, 같은 객체를 가리키고 있을까요?
A. 정수형 기준으로 작은 정수 값일 경우(-5~256) 그런 것 같으나, 숫자 값이 커지면 그러지 않는 듯 하네요.[2]

>>> a = 1
>>> b = 1
>>> id(a) == id(b)
True
>>> a = 10000
>>> b = 10000
>>> id(a) == id(b)
False

가변 객체의 변수의 값을 수정할 경우

>>> a=[1,2]
>>> id(a)
4382117760
>>> a.append(3)
>>> id(a)
4382117760

list의 값을 추가할 경우 어쨌든 list는 수정이 되었으나, list가 저장된 위치에는 수정이 없습니다.


2. 해시맵

해시맵과 가변/불변객체에는 어떤 관계가 있을까요?
그 전에 해시맵에 무엇인지 부터 알아보겠습니다.

해시맵이란, 해시 테이블, 해시 맵, 해시 표는 컴퓨팅에서 키를 값에 매핑할 수 있는 구조인, 연관 배열 추가에 사용되는 자료 구조

해시함수를 사용하여 키를 해시값으로 매핑하고, 이 해시값을 색인(Index) 혹은 주소 삼아 데이터의 값(value)을 키와 함께 저장하는 자료구조

그렇다면, 해시함수는 무엇얼까요?

해시함수란, 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수

성능 좋은 해시함수라면 어떠한 데이터도 모두 다르게 분류할 수 있어야 하겠죠.

메모리 상 해시맵에서 키를 통해 값을 찾는 과정

키로 들어온 값을 내부적으로 해시를 통해서 메모리의 위치를 찾아 냅니다.

A 라는 키가 입력되었을 때 해시 함수를 통해 나온 값이 메모리에 위치한 배열의 인덱스값이며, 해당 위치의 저장된 값이 반환됩니다.

Q. 그렇다면 해시 함수의 key로는 어떤 유형의 객체를 사용할 수 있을까요?
A. 불변 타입만 가능합니다!

해시 함수의 key로서 가변(mutable)타입이 불가한 이유

dictionary는 키 값에서 계산된 해시 값을 사용하여 저장된 key를 찾습니다.

그런데, 가변 객체를 이용할 경우 key값이 바뀌면, 해시함수의 결과 값이 바뀌어 버립니다...!

값이 저장되어 위치는 그대로인데, 해시 함수의 결과값이 바뀌어 버렸으니 더이상 그 값이 어디에 있는지 찾을 수 없겠죠...

그래서 해시함수의 key로는 불변 객체만 이용합니다.

Reference

[1] https://www.binaryflavor.com/paisseonyi-modeun-byeonsuneun-gaegce-object-cwayi-caijeomeun/

[2] https://www.quora.com/In-Python-why-do-two-integers-with-the-same-values-have-the-same-ID-Are-they-referring-to-the-same-object

[3] https://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%85%8C%EC%9D%B4%EB%B8%94

[4] https://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98

profile
Today I learned...

0개의 댓글