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()
'파이썬 > 기초문법' 카테고리의 다른 글
Python namespace에 대한 이해 / Python 네임스페이스 (0) | 2020.04.15 |
---|---|
Python First Class Function 일급 함수 (0) | 2020.04.09 |
Python 클래스에 대해 1 (0) | 2020.03.15 |
Python Exception 발생시 해당 소스, 라인 출력하기 (0) | 2020.03.03 |
Python Map에 대한 이해 (1) | 2020.02.14 |
댓글