Mutable vs. Immutable

ddurru·2025년 1월 7일
0

Mutable vs. Immutable

  • Mutable value
    • Python에서 변할 수 있는 객체 (변경 가능)
    • List와 Dict 자료형이 포함
  • Immutable value
    • Python에서 변할 수 없는 객체 (변경 불가능)
    • Number, String, Tuple 자료형이 포함

변경 가능 여부와 메모리 사용

  • Mutable 객체
    • 값을 변경해도 동일한 메모리 주소를 사용
    • 따라서 한 변수의 값이 변경되면 같은 객체를 참조하는 다른 변수에도 영향을 주게됨
  • Immutable 객체
    • 값을 변경하려고 하면 새로운 객체가 생성되고, 기존 객체는 변경되지 않음
# Mutable 예시
a = [1, 2, 3]
b = a
b.append(4)
print(a)  # [1, 2, 3, 4] (a도 변경됨)

# Immutable 예시
x = "hello"
y = x
y += " world"
print(x)  # "hello" (x는 변경되지 않음)
print(y)  # "hello world" (새로운 객체 생성)

Assignment와 Mutable/Immutable

  • Mutable 객체
    • 변수에 객체를 할당하면 해당 변수는 객체의 참조(reference)를 저장
    • 따라서 한 변수를 통해 객체를 수정하면, 동일한 객체를 참조하는 다른 변수에도 영향을 미치게 됨
    • 변수 간의 연결성에 주의해야 하며, 예상치 못한 값 변경을 방지하려면 복사(copy)를 사용해야 함
  • Immutable 객체
    • 변수에 객체를 할당한 경우 값을 직접 변경할 수 없으며, 새로운 값을 할당할 때 새로운 객체가 생성됨
    • 따라서 다른 변수는 영향을 받지 않음
    • 객체 자체는 변경되지 않기 때문에, 데이터 무결성을 유지하면서 값을 안전하게 사용할 수 있음
# Mutable 객체
a = [1, 2, 3]
b = a  # b는 a를 참조
b[0] = 99
print(a)  # [99, 2, 3] (a도 변경됨)

# Immutable 객체
x = "hello"
y = x  # y는 x를 참조
y = "world"  # 새로운 문자열 객체를 할당
print(x)  # "hello" (x는 변경되지 않음)
print(y)  # "world" (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)  # [1, 2, 3, 4]

my_tuple = (1, 2, 3)
modify_tuple(my_tuple)
print(my_tuple)  # (1, 2, 3)

활용사례와 주의사항

  • Mutable 객체
    • 데이터 구조 조작(리스트에 데이터 추가/삭제 등)에 적합
    • 상태를 저장하고 변경해야 하는 상황에서 유용
    • Mutable 객체의 Side Effect
      	
       def add_item(my_list):
       	my_list.append(100)  # 원본 리스트가 변경됨
           
       	lst = [1, 2, 3]
       	add_item(lst)
       	print(lst)  # [1, 2, 3, 100]
       
  • Immutable 객체
    • 데이터의 무결성(integrity)을 보장해야 하는 상황에서 적합
    • (예) 딕셔너리 키, 함수 기본값, 멀티스레드 환경에서의 안전한 데이터 처리
    • Immutable 객체의 효율성
      • Immutable 객체는 변경되지 않으므로 멀티스레드 환경이나 캐싱(caching) 작업에 적합하며, 불변성을 활용한 안정성이 보장

결론

  • Mutable
    • 동적으로 데이터를 수정해야 하는 경우 적합하며, 유연하지만 신중한 관리가 필요함
  • Immutable
    • 변경되지 않는 데이터가 필요한 상황에서 안정적이고 안전하게 사용할 수 있음

참고

profile
2024.04.15 ~

0개의 댓글