본문 바로가기
파이썬/기초문법

Python Mutable vs Immutable / Mutable / Immutable

by 행복론자 2020. 3. 16.

Python은 모든 것을 객체로 표현합니다. 

Python에서 표현할 수 있는 객체들은 Mutable / Immutable 하냐로 구분할 수 있습니다. 

 

여기서, 

Mutable은 '변경 가능한' 이라는 의미이고 

Immutable '변경 가능하지 않은' 이라는 의미입니다.

 

Python 객체가 변경 가능하냐 안하냐는 무슨 의미일까요?

간단하게 객체의 값을 바꿀 수 있느냐 없느냐라고 생각해보겠습니다.

예를 들어 str 객체는 실제로 Immutable (변경가능하지 않은) 객체입니다.

 

한번 할당하면 값을 바꿀 수가 없습니다.

조회는 가능합니다. 

str_test = "test"
print(str_test[0]) # t

 

 

str은 Immutable 하다고 했으니 바꿀 수가 없습니다. 

변경을 시도하면 에러가 발생합니다. 

str_test = "test"
str_test[0] = 'x' # TypeError: 'str' object does not support item assignment

 

 

반대로 list는 Mutable(변경가능한)한 객체입니다.

값을 할당하고 변경해도 아무런 문제가 없습니다.

list_test = [1,2,3]
list_test[0] = 1

 

 

값이 변경이 가능하다고 해서 새로운 객체로 할당된 것은 아닙니다.

이는 id 함수를 통해 저장 주소를 확인해보면 주소가 바뀌지 않았다는 것을 알 수 있습니다. 

list_test = [1,2,3]
print(id(list_test)) # 7388096
list_test[0] = 1
print(id(list_test)) # 7388096

 

 

Mutable한 객체는 값 변경이 쉽기 때문에 사용에 주의해야합니다.

예를 들어 위의 예제에서 추가로 변수 list_test2를 만들어 보겠습니다.

list_test = [1,2,3]
list_test2 = list_test

 

 

list_test2를 통해서도 객체의 값을 변경할 수 있습니다.

list_test2와 list_test가 바라보는 객체가 동일하므로 한쪽에서 변경 이후

어느 변수를 통해서 확인하더라도 값이 바뀌었습니다.

list_test = [1,2,3]
list_test2 = list_test
list_test2[0] = 5
print(list_test2) # [5, 2, 3]
print(list_test) # [5, 2, 3]

 

 

이렇게 두 변수를 통해서 [1,2,3]에 접근해 값 변경이 가능하기 때문에

Mutable한 객체를 참조하는 두 변수가 서로 독립적이라고 생각하면 의도치 않은 문제가 생길 수 있으니 주의해야합니다.

(이 문제를 해결하기 위한 방법 중 하나로는 deepcopy 함수 사용이 있습니다.)

 

 

마지막으로 Python 객체들을 Mutable / Immutable로 구분하면 이렇습니다. 

> Mutable : list(), bytearray(), set(), dict(), classes, class instances (immutable하게 할 수는 있음)

> Immutable: int(), float(), complex(), str(), tuple(), frozenset(), bytes()

 

 

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글