[Python] mutable(가변 객체), immutable(불변 객체)
파이썬의 mutable, immutable 객체를 정확히 알고 가자.
mutable
생성 후 상태 변경 가능(가변)한 객체
객체들의 값이 같은 경우 각각 다른 id 값(변수의 메모리 주소값)을 가짐
한 객체의 상태 변경 전과 후는 같은 id 값(변수의 메모리 주소값)을 가짐
- list
- set
- dict
우선 생성 후 상태 변경 가능의 의미는 아래 코드를 보자.
li = [1, 2, 3]
li[0] = 3
print(li) # [3, 2, 3]
li라는 list를 생성 후 0번째 인덱스의 값을 변경할 수 있다.
1. 객체들의 값이 같은 경우 각각 다른 id 값(변수의 메모리 주소값)을 가짐
li_1 = ['a', 'b', 'c']
li_2 = ['a', 'b', 'c']
li_3 = ['a', 'b', 'c']
print(id(li_1), id(li_2), id(li_3))
# 2501789136768 2501791190336 2501791159936
li_1, li_2, li_3의 id값은 모두 다르다.
이는 세 개의 변수가 모두 다른 주소 값을 참조하고 있다는 말이다.
2. 한 객체의 상태 변경 전과 후는 같은 id 값(변수의 메모리 주소값)을 가짐
li = [1, 2, 3]
print(id(li))
# 1656961829056
li[0] = 3
print(id(li))
# 1656961829056
immutable
생성 후 상태 변경 불가(불변)한 객체
객체들의 값이 같은 경우 동일한 id 값(변수의 메모리 주소값)을 가짐
한 객체의 값 변경 전과 후는 다른 id 값(변수의 메모리 주소값)을 가짐
- int
- float
- bool
- str
- tuple
- frozenset
생성 후 상태 변경 불가능의 의미는 아래 코드를 보자.
s = '123'
s[0] = '3'

오류 메세지를 보면 아이템 할당을 지원하지 않는다고 한다.
s라는 string을 생성한 후 0번째 인덱스를 바꿀 수 없다.
1. 객체들의 값이 같은 경우 동일한 id 값(변수의 메모리 주소값)을 가짐
s_1 = 'abc'
s_2 = 'abc'
s_3 = 'abc'
print(id(s_1), id(s_2), id(s_3))
# 2501787757104 2501787757104 2501787757104
s_1, s_2, s_3의 id값은 모두 같다.
이는 세 개의 변수가 모두 같은 주소 값을 참조하고 있다는 말이다.
2. 한 객체의 값 변경 전과 후는 다른 id 값(변수의 메모리 주소값)을 가짐
s = '123'
print(id(s))
# 3081990308208
s = '456'
print(id(s))
# 3081990308272
위 1번에서 객체들의 값이 같을 경우 동일한 id값을 가진다고 했다.
값을 변경하여 객체들이 동일한 값을 갖게 한다면 같은 주소를 바라볼지 확인해보자.
2-1. list의 경우
s_1 = 'aBC'
s_2 = 'ABc'
print(id(s_1), id(s_2))
# 1480605368560 1480605368688
s_1 = s_1.upper()
s_2 = s_2.upper()
print(id(s_1), id(s_2))
# 1480605383920 1480605383792
정답은 아니다!
s_1과 s_2 모두 upper()를 사용하여 'ABC'의 값을 동일하게 갖게 했지만 서로 다른 주소 값을 바라본다.
2-2. int의 경우
s_1 = 122
s_2 = 124
print(id(s_1), id(s_2))
# 2425745201296 2425745201360
s_1 += 1
s_2 -= 1
print(id(s_1), id(s_2))
# 2425745201328 2425745201328
정답은 맞다! (값을 변경 후 동일한 값을 가진다면 동일한 주소값을 바라본다.)
mutable 안 immutable
mutable 안에 있는 immutable의 id 값을 확인해보자.
li_1 = ['a', {'s', 'e', 't'}]
li_2 = ['a', {'s', 'e', 't'}]
print(id(li_1), id(li_2))
# 1880871800576 1880871799680
print(id(li_1[0]), id(li_2[0]))
# 1880868556016 1880868556016
print(id(li_1[1]), id(li_2[1]))
# 1880871758752 1880871758080
li_1과 li_2는 값이 같지만 mutable 객체이므로 id값이 서로 다르다.
각 list의 0번째 인덱스는 string 타입으로 immutable 객체다.
-> 동일한 값('a')을 가지므로 id값은 서로 같다.
각 list의 1번째 인덱스는 set 타입으로 mutable 객체다.
-> 동일한 값을 갖지만 mutable 객체이므로 id값이 서로 다르다.
앞서 말한 특성을 유지한다!
'Python > 파이썬 중급' 카테고리의 다른 글
| [Python] setdefault 함수 (0) | 2022.12.11 |
|---|---|
| [Python] sorted, sort 함수 (0) | 2022.12.11 |
| [Python] map, filter 함수 (0) | 2022.12.07 |
| [Python] MappingProxyType (0) | 2022.12.07 |
| [Python] 네임드 튜플 (namedtuple) (0) | 2022.12.06 |