Mutable 과 Immutable 의 의미

2019. 8. 12. 13:29Programming Tutorial/Python

 

파이썬 내의 모든 것은 object 입니다. 

 

그리고 파이썬을 처음 배우는 사람들이 만드시 알아야 할 것 중 하나는

 

파이썬 내 모든 오브젝트는 mutable 혹은 immutable 하다는 것이죠..

 

 

좀 더 Detail하게 들어가보겠습니다. 파이썬내 모든 것은 오브젝트이기 때문에 모든 변수는 오브젝트 인스턴스를 가지고 있습니다. 오브젝트가 초기화 될 때 오브젝트 id를 할당 하겠지요. 그것의 type은 runtime에서 정의되고 이후에는 절대 변하지 않습니만, state는 변할수 있습니다. 만약 mutable이면 말이죠.

장황한 설명이었는데, 간단히 말해서 아래와 같이 정리하면 될 것 같습니다.

 

mutable 오브젝트는 생성된 후 변경 가능하고, immutable 오브젝트는 생성된 후 변경이 불가능 하다.

 

int, float, bool, str, tuple, unicode.. 이런 느낌은 immutable

list, set, dict... 이런 느낌은 mutable

 

자 그럼 어떻게 우리가 쓰는 변수가 mutable하냐 immutable하냐를 알수 있으까요?

그러려면 일단 id와 type이라는 빌트인 함수에 대해서 알아봐야겠습니다.

id함수는 오브젝트의 id를 integer로 반환합니다.

이게 대게 해당 오브젝트의 메모리 주소를 의미한다고 보시면 되겠습니다.

 

type 함수는 오브젝트의 형태를 반환합니다. 

 

한번 해보면..

''' Example 1 '''
>>> x = "Holberton"
>>> y = "Holberton"
>>> id(x)
140135852055856
>>> id(y)
140135852055856
>>> print(x is y) '''comparing the types'''
True
''' Example 2 '''
>>> a = 50
>>> type(a)
<class: ‘int’>
>>> b = "Holberton"
>>> type(b)
<class: 'string'>

이제 이 두가지 함수를 이용해서 mutable와 immutable을 확인해보죠.

 

Mutable and Imutable Objects

앞서서 미리 언급했던 거와 같이 Mutable의 생성 이후 state와 contents 를바꿀수 있고, Immutable은 안된다. 라고 말씀 드렸었고, 대충 아래와 같이 나누었었습니다.

 

Mutable Objects

- list / dict / set / byte array

 

Immutable Objects

- int / float / complex / string / tuple / frozen set (immutable version of set) / bytes

 

자 이제 mutability를 체크해봅시다.

 

x = 10
y = x

int type의 오브젝트 (10)을 만들고 x와 y가 모두 같은 오브젝트 (10)을 가르키도록 했습니다.

 

그러면 id함수로 확인 할수 있는 값이 모두 같다는 것을 확인 할수 있습니다.

 

id(x) == id(y) 이나 

id(y) == id(10) 로 확인해보면 True를 반환 하겠지요.

 

이때 x에 1을 더해봅시다.

 

x = x +1

이 이후에도 

id(x) == id(y) 이나 

id(y) == id(10) 로 확인해보면 True를 반환할까요?

 

아닙니다.

 

id(x)의 값만 바뀌었습니다. id(10)은 바뀌지 않았지요. 당연히 id(y) 도 요.

 

id(x) != id(10)

id(x) != id(y) 이렇게 해야 True를 반환하겠네요.

 

이 간단한 test로 int type은 immutable하기 때문에 바뀌지 않았다고 보시면 되겠습니다.

 

 

 

Mutable 오브젝트는 그럼 위와 같은 실험에 어떻게 결과가 나올까요?

 

m = list([1, 2, 3])
n = m

list를 만들어서 위에서 했던 것과 같이 m과 n에 할당해보았습니다.

list는 immutable한 int값의 모음으로 만들었습니다.

 

m.pop()

m에서 아무 값을 하나 빼내봅시다. 

 

m의 원소 3개중 하나는 빼내졌겠지요?

 

id(m) == id(n) 은 True 일까요? 즉 같인 list오브젝트를 가르키고 있을까요?

 

 

네. 그렇네요. 원소가 하나 없어진 [1,2] 라는 값으로 동일한 주소의 오브젝트를 가르키고 있습니다.

 

아하 이게 바로 mutable 이군요.

 

 

 

내용 보충 정리 해봅시다.

 

1) 파이썬은 mutable와 immutable 오브젝트를 다르게 다룬다.

2) immutable 이 mutable 오브젝트 보다 더 접근하기 빠르다. - 어찌보면 당연 할 듯...

3) Mutable 오브젝트는 바꾸기 쉽다. immutable은 실질적으로 change가 아닌 copy를 하므로 expensive하다.