파이썬의 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