Python

Immutable 과 Mutable

지야소이 2023. 4. 13. 21:36

Immutable과 Mutalbe이 무엇인지 차이점을 알아보겠습니다.

 

- immutable : 수정 불가능한 객체 

                      ex) int, float, str, tuple

- mutable : 수정 가능한 객체

                     ex) list, dictionary

 

먼저 다음 코드를 실행해보고 메모리 상에서 어떤 변화가 있을지 생각해봅니다.

a = "python2"
id(a)
2623587526960

a = "python3"
id(a)
2623587526896

위 코드의 뜻은 이렇게 됩니다.

"python2"라는 문자열 객체가 메모리의 2623587526960 번지에 할당되고 해당 객체를 a라는 변수가 바인딩합니다.
"python3"라는 문자열 객체가 메모리의 2623587526896 번지에 할당되고 해당 객체를 a라는 변수가 바인딩합니다.
"python2"라는 문자열 객체는 아무도 자신을 참조하지 않기 때문에 가비지 컬렉터에 의해 자동으로 메모리에서 소멸됩니다.​

    * 가비지 컬렉터

 : 시스템 공통의 직접 액세스 장치상의 파일 영역에 있어서의 상기 문제를 해결하기 위한 가비지 해방이나 파일 재배치를      하기 위한 처리 기능을 가지는 프로그램

 

→  문자열 객체는 immutable 객체로서 수정 불가능하기 때문에 기존 객체는 그대로 있으며 새로운 문자열 객체가 생성됩니다. 변수가 새로운 문자열 객체를 바인딩하게 되면 기존 문자열 객체는 가비지 컬렉터에 의해 자동으로 소멸됩니다. 

 

예시로, 

# x를 Aello World!!로 변경하고 싶다면?
x="Hello World!!"
x[0] ='A' 
print(x)

TypeError: 'str' object does not support item assignment

여기서 TypeError는 'str' 가 immutable 객체라서 뜨는 에러입니다.

따라서, string에서 'H'를 'A'로 변경하고 싶을 경우, 우회해서 설정을 해야합니다.

x="Hello World!!"
x='A'+x[1:]
print(x)

Aello World!!

 

 

이번에는 리스트에 대해서 수정을 해봅시다. a라는 변수는 리스트 객체를 바인딩합니다.

리스트에 값을 추가해도 리스트 객체의 시작 주소 값은 변하지 않음을 알 수 있습니다.

a=["python2","python3"]
id(a)
2623622180608
a.append("python4")
a
['python2', 'python3', 'python4']
id(a)
2623622180608
id(a[0])
2623587526960
id(a[1])
2623587526896
id(a[2])
2623622223920

 

 

→ 리스트 객체는 mutable 객체로서 수정이 가능하며 [0]번, [1]번, [2]번이 리스트의 원소인 문자열 객체를 다시 바인딩하는 구조로 갖습니다.  따라서 리스트에 원소를 추가하거나 삭제해도 리스트 객체의 시작 주소는 변하지 않습니다.