파이썬의 객체는 mutable과 immutable 중 하나의 속성을 갖는다. 두 개념에 대해 알아보기 전에 중요한 사실 두 가지만 짚고 넘어가겠다.
따라서 다른 값을 할당이 가능하다고 해서 해당 변수가 참조하는 객체가 mutable한 것은 아니다.
객체의 내부 상태를 변경 가능한 속성을 의미한다. 이러한 속성을 가진 객체는 다음과 같다.
객체를 참조하는 변수에 다른 객체를 할당 가능하다고 해서 이 객체가 mutable한 것은 아니다.
해당 객체의 내부 상태를 변경할 수 있다는 것은 보유한 원소의 값을 변경할 수 있다는 것을 의미한다.
무슨 말인지 예시 코드를 보자.
a = [1, 2, 3, 4]
print(id(a))
a[0] = 5
a.append(7)
print(id(a))
a = [2, 3, 4, 5]
print(id(a))
# result
139967858993344
139967858993344
139967859099840
변수 자체에 다른 리스트를 할당하면 주소가 변하는 것을 볼 수 있다.
생성된 시점의 값으로 고정된 객체를 의미한다. immutable한 객체는 다음과 같다.
숫자 자료형 객체가 포함된 것이 이상할 수도 있다.
하지만 변수의 값을 바꾸는 것은 단지 다른 객체로 참조를 변경하는 것이라는 것을 명심하자.
예시를 보자.
a = 3
print(id(a))
a = 5
print(id(a))
# result
140720192323888
140720192323952
위 코드에서 a
의 값이 3에서 5로 변경된 것처럼 보이겠지만 3-객체
를 참조하던 a
의 참조값이 5-객체
로 변경된 것 뿐이다. 객체의 값은 변하지 않았다.
a = 'hello'
a[0] = 'y'
# error
TypeError: 'str' object does not support item assignment
문자열의 원소를 바꾸려고 하면 위와 같이 에러가 발생한다.
a = 'hello'
print(id(a))
a += ', world'
print(id(a))
# result
140311019158896
140311019159216
hello, world
문자열이 변경되었지만 주소가 변한 것을 보면 새로운 문자열이 생성된 것이라는 것을 알 수 있다.
당연한 얘기로 들릴 수도 있겠지만, 딕셔너리 자료형의 key값은 항상 immutable한 객체이다. 딕셔너리는 내부적으로 key를 해시한 결과값을 value를 저장하는 인덱스로 사용하기 때문이다.
쉽게 생각해서 key값 자체가 일종의 주소인데 이것을 바꿔버리면 value로 찾아갈 수 없는 것이다.