Python에서 Mutable vs Immutable Objects (쉽게 설명)
Source: Dev.to
소개
이 글은 데이터 구조, 재귀, 백트래킹 작업 시 자주 혼동되는 파이썬의 핵심 개념을 설명합니다. 파이썬에서 객체는 내부 상태가 변할 수 있는지 여부에 따라 크게 두 종류로 나뉩니다:
- Mutable 객체
- Immutable 객체
이 구분을 이해하는 것은 올바르고 예측 가능한 파이썬 코드를 작성하는 데 매우 중요합니다.
Mutable 객체
Mutable 객체는 생성 후에도 내용이 변경될 수 있는 객체입니다. Mutable 객체를 수정하면:
- 메모리 상의 동일한 객체가 업데이트됩니다.
- 메모리 주소는 변하지 않습니다.
대표적인 mutable 타입으로는 list, set, dict 등이 있습니다.
a = [1, 2, 3]
a.append(4)
print(a) # [1, 2, 3, 4]
위 예시에서 a는 여전히 같은 리스트를 가리키지만, 리스트의 내용이 제자리에서 변경되었습니다.
Immutable 객체
Immutable 객체는 생성 후 내용이 변경될 수 없는 객체입니다. 겉보기에 객체를 수정하는 연산을 수행하면 실제로는:
- 새로운 객체가 생성됩니다.
- 새로운 메모리 주소가 할당됩니다.
대표적인 immutable 타입으로는 int, float, str, tuple, frozenset 등이 있습니다.
x = 10
x = x + 1
print(x) # 11
무슨 일이 일었는가
- 정수
10자체는 변경되지 않았습니다. - 새로운 정수
11이 생성되었습니다. x는 이제 새로운 객체를 가리킵니다.
변이성의 영향
객체의 변이성은 파이썬 프로그래밍의 여러 측면에 영향을 미칩니다:
- 함수 인자 – mutable 인자는 함수 내부에서 변경될 수 있어 호출자의 변수에 영향을 줍니다.
- 재귀와 백트래킹 – immutable 객체는 상태 변화를 추론하기 쉽게 합니다.
- 공유 참조 – 여러 변수가 같은 mutable 객체를 참조하면 예상치 못한 부작용이 발생할 수 있습니다.
예시: Mutable 인자
def add_item(lst):
lst.append(100)
nums = [1, 2, 3]
add_item(nums)
print(nums) # [1, 2, 3, 100]
리스트 nums가 함수 밖에서도 변경된 이유는 해당 리스트가 mutable이기 때문입니다.
요약
- Mutable 객체(예:
list,set,dict)는 생성 후에도 변경 가능하며 메모리 주소가 동일하게 유지됩니다. - Immutable 객체(예:
int,float,str,tuple,frozenset)는 변경할 수 없으며, 연산 결과는 새로운 객체와 새로운 주소를 갖습니다.
mutable과 immutable의 구분을 염두에 두면 흔히 발생하는 버그를 예방하고 디버깅에 드는 시간을 크게 절감할 수 있습니다.