[Python] mutable과 immutable

sudog·2023년 8월 29일
0

Python

목록 보기
2/4

파이썬의 객체는 mutable과 immutable 중 하나의 속성을 갖는다. 두 개념에 대해 알아보기 전에 중요한 사실 두 가지만 짚고 넘어가겠다.

  • 파이썬에서 모든 데이터는 객체이다.
  • 변수는 객체에 대한 참조를 갖는다.

따라서 다른 값을 할당이 가능하다고 해서 해당 변수가 참조하는 객체가 mutable한 것은 아니다.


mutable

객체의 내부 상태를 변경 가능한 속성을 의미한다. 이러한 속성을 가진 객체는 다음과 같다.

  • list
  • set
  • dictionary

객체를 참조하는 변수에 다른 객체를 할당 가능하다고 해서 이 객체가 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

생성된 시점의 값으로 고정된 객체를 의미한다. immutable한 객체는 다음과 같다.

  • number(int, float, ...)
  • string
  • tuple

숫자 자료형 객체가 포함된 것이 이상할 수도 있다.
하지만 변수의 값을 바꾸는 것은 단지 다른 객체로 참조를 변경하는 것이라는 것을 명심하자.

예시를 보자.

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로 찾아갈 수 없는 것이다.

profile
안녕하세요

0개의 댓글