(Python) mutable과 immutable한 자료형
mutable과 immutable
mutable(변할 수 있는)
데이터의 값을 변경 할 수 있는 자료형이다. 즉 인덱스를 통해 값의 변경이 가능 하고 처음 값을 생성한 이후에 값을 변경, 추가 삭제 할 수 있다. mutable한 자료형은 값을 변경시켜도 가리키고 있는 메모리는 동일하기 때문에 객체는 변경되지 않는다. 즉, 메모리 주소는 같다
list 타입, dict 타입, set타입, 바이트 배열 타입(byte array)
아래의 코드를 보면 mutable한 list에 d라는 문자를 append시켜주면 ex_list 의 값은 변경이 된다 하지만 ex_list의 객체는 변경되지 않는다. 메모리가 가리키고 있는 주소는 같은 것을 볼 수 있다
ex_list = ['a', 'b', 'c']
print(id(abcd_list)) # 139692873276680
print(abcd_list) # ['a', 'b', 'c']
ex_list.append('d')
print(ex_list) # ['a', 'b', 'c', 'd']
print(id(ex_list)) # 139692873276680
immutable(변할 수 없는)
데이터의 값을 변경 할 수 없는 자료형이다. 즉 인덱스를 통해 값의 변경이 불가능하고 처음 값을 생성한 이후에 값을 변경 할 수 없다
숫자타입(int, float, complex), 문자열 타입, 튜플 타입, 불변세트 타입, 바이트 타입
아래의 코드를 보면 ex_str에 +’e’ 를 해주어도 실제 ex_str의 값이 변경되는 것은 아니다. 객체도 변경이 되지 않는다. +’e’ 한 값을 보고 싶다면 새로운 객체값을 변수(ex_str2)에 대입해야 값이 변경된다. 즉 메모리 주소가 변경된다
ex_str = 'abcd'
print(id(ex_str)) # 139692877839136
print(ex_str + 'e') # abcde // ex_str의 값 자체가 변경되지는 않는다. 즉 가비지 컬렉션의 대상이 된다
print(ex_str) # abcd
ex_str2 = ex_str + 'e' # 새로운 객체값을 변수에 대입을 해야 값이 변경된다, 객체 id도 변경된다
print(ex_str2) # abcde
print(id(ex_str2)) # 139692873526048
데이터 타입에 immutable과 mutable이 있는 이유
성능적인 이점 때문에 그렇다. mutable같은 자료형은 append같은 여러 메서드를 사용할 수 있다. 하지만 immutable은 그렇지 못하다.
만약 변할 수 없는 데이터 타입의 값을 빈번하게 바꾸면 객체가 메모리상에서 계속 생성될 것이다. 이는 프로그램이 사용하는 메모리를 과하게 사용하는 원인이 된다. 이때 변할 수 있는 데이터 타입을 사용하면 객체를 새롭게 생성하지 않아도 된다 즉 메모리 누수를 방지하면서 메모리 사용 효율을 올릴 수 있다