Mutable vs. Immutable

- Mutable value
- Python에서 변할 수 있는 객체 (변경 가능)
- List와 Dict 자료형이 포함
- Immutable value
- Python에서 변할 수 없는 객체 (변경 불가능)
- Number, String, Tuple 자료형이 포함
변경 가능 여부와 메모리 사용
- Mutable 객체
- 값을 변경해도 동일한 메모리 주소를 사용
- 따라서 한 변수의 값이 변경되면 같은 객체를 참조하는 다른 변수에도 영향을 주게됨
- Immutable 객체
- 값을 변경하려고 하면 새로운 객체가 생성되고, 기존 객체는 변경되지 않음
a = [1, 2, 3]
b = a
b.append(4)
print(a)
x = "hello"
y = x
y += " world"
print(x)
print(y)
Assignment와 Mutable/Immutable
- Mutable 객체
- 변수에 객체를 할당하면 해당 변수는 객체의 참조(reference)를 저장
- 따라서 한 변수를 통해 객체를 수정하면, 동일한 객체를 참조하는 다른 변수에도 영향을 미치게 됨
- 변수 간의 연결성에 주의해야 하며, 예상치 못한 값 변경을 방지하려면 복사(copy)를 사용해야 함
- Immutable 객체
- 변수에 객체를 할당한 경우 값을 직접 변경할 수 없으며, 새로운 값을 할당할 때 새로운 객체가 생성됨
- 따라서 다른 변수는 영향을 받지 않음
- 객체 자체는 변경되지 않기 때문에, 데이터 무결성을 유지하면서 값을 안전하게 사용할 수 있음
a = [1, 2, 3]
b = a
b[0] = 99
print(a)
x = "hello"
y = x
y = "world"
print(x)
print(y)
함수 호출 시 동작 차이
- Mutable 객체
- 함수 내부에서 객체를 수정하면 원본 객체에도 영향을 미치게 됨
- Immutable 객체
- 함수 내부에서 값을 변경하려고 하면 새로운 객체가 생성되며 원본 객체는 영향을 받지 않음
def modify_list(lst):
lst.append(4)
def modify_tuple(tpl):
tpl += (4,)
my_list = [1, 2, 3]
modify_list(my_list)
print(my_list)
my_tuple = (1, 2, 3)
modify_tuple(my_tuple)
print(my_tuple)
활용사례와 주의사항
- Mutable 객체
- Immutable 객체
- 데이터의 무결성(integrity)을 보장해야 하는 상황에서 적합
- (예) 딕셔너리 키, 함수 기본값, 멀티스레드 환경에서의 안전한 데이터 처리
- Immutable 객체의 효율성
- Immutable 객체는 변경되지 않으므로 멀티스레드 환경이나 캐싱(caching) 작업에 적합하며, 불변성을 활용한 안정성이 보장
결론
- Mutable
- 동적으로 데이터를 수정해야 하는 경우 적합하며, 유연하지만 신중한 관리가 필요함
- Immutable
- 변경되지 않는 데이터가 필요한 상황에서 안정적이고 안전하게 사용할 수 있음
참고