본문 바로가기

개념

[파이썬] 불변객체와 가변객체

파이썬에서는 객체를 가변(mutable)객체와 불변(immutable)객체로 구분할 수 있습니다. 객체의 가변성 여부는 객체의 값이 변경 가능한지 여부를 의미합니다.

1. 불변 객체(Immutable Objects)


불변 객체는 생성 후에는 그 값을 변경할 수 없는 객체입니다. 즉, 한 번 생성된 값은 변경되지 않습니다. 불변 객체의 대표적인 예시로는 숫자(int, float), 문자열(str), 튜플(tuple) 등이 있습니다.

다음은 문자열을 예시로 들어보겠습니다. 문자열은 변경이 불가능하기 때문에, 한 번 생성된 문자열은 값이 변경되지 않습니다. 예를 들어, 다음과 같은 코드에서 s의 값이 변경되지 않습니다.

 

s = 'hello'
s[0] = 'H'  # TypeError 발생

위 코드에서 s[0] = 'H' 라인에서 TypeError가 발생합니다. 이는 문자열은 불변 객체이기 때문입니다.

불변 객체는 다음과 같은 특징을 가집니다.

  • 값이 변경되지 않기 때문에 안전하게 공유될 수 있습니다.
  • 다른 객체와 구별될 수 있는 고유한 값을 가집니다.
  • 해싱(Hashing)이 가능합니다. 해싱은 값을 고유한 정수로 매핑하는 기능입니다. 이는 딕셔너리나 셋(Set) 같은 컨테이너 객체에서 사용됩니다.

 

2. 가변 객체(Mutable Objects)


가변 객체는 생성 후에도 값이 변경될 수 있는 객체입니다. 대표적인 가변 객체로는 리스트(list), 딕셔너리(dict), 집합(set) 등이 있습니다.


가변 객체는 값이 변경될 수 있기 때문에 다음과 같은 특징을 가집니다.

  • 값이 변경될 수 있기 때문에 공유되면 안전하지 않습니다.
  • 가변 객체는 고유한 값을 가지지 않습니다. 예를 들어, 빈 리스트를 생성하고 값을 변경한 뒤 다시 빈 리스트를 생성하면 두 리스트는 서로 다른 객체입니다.
  • 해싱이 불가능합니다. 따라서 딕셔너리나 셋(Set) 같은 컨테이너 객체에서는 사용할 수 없습니다.

 

다음은 리스트를 예시로 들어보겠습니다. 리스트는 값이 변경될 수 있는 가변 객체이기 때문에, 한 번 생성된 값은 변경될 수 있습니다.

 

lst = [1, 2, 3]
lst[0] = 4  # lst의 값이 [4, 2, 3]으로 변경됨


위 코드에서 lst[0] = 4 라인에서 리스트의 값이 변경됩니다. 이는 리스트가 가변 객체이기 때문입니다.

 

3. 복습

 

다음은 리스트와 튜플, 딕셔너리의 가변성 여부에 대한 예제입니다.


1) 리스트(List)

 

리스트는 가변 객체이기 때문에, 생성 후에도 값이 변경될 수 있습니다. 예를 들어, 다음과 같은 코드에서 lst의 값을 변경할 수 있습니다.

 

lst = [1, 2, 3]
lst[0] = 4  # lst의 값이 [4, 2, 3]으로 변경됨

 

2) 튜플(Tuple)


튜플은 불변 객체이기 때문에, 생성 후에는 값이 변경될 수 없습니다. 예를 들어, 다음과 같은 코드에서 tpl의 값을 변경할 수 없습니다.

 

tpl = (1, 2, 3)
tpl[0] = 4  # TypeError 발생

 

3. 딕셔너리(Dictionary)


딕셔너리는 가변 객체이기 때문에, 생성 후에도 값이 변경될 수 있습니다. 예를 들어, 다음과 같은 코드에서 dct의 값을 변경할 수 있습니다.

 

dct = {'a': 1, 'b': 2, 'c': 3}
dct['a'] = 4  # dct의 값이 {'a': 4, 'b': 2, 'c': 3}으로 변경됨


위 예제들을 통해 리스트, 튜플, 딕셔너리의 가변성 여부를 알아보았습니다. 이러한 객체의 가변성 여부를 이해하는 것은 객체의 값이 변경될 수 있는지 여부를 파악하는 데 도움이 됩니다.