본문 바로가기

Languages/Python

Immutable vs mutable, shallow copy vs deep copy

Python에서 모든 것은 객체다. 변수는 객체에 대한 참조를 저장한다. 객체에 대한 참조는 해당 객체의 메모리 주소를 가리키는 포인터와 같은 역할을 한다.

Python에서의 객체는 mutable과 immutable로 나눠진다.

Immutable 객체와 Mutable 객체

immutable 객체

immutable (불변) 객체는 한 번 생성된 후에는 그 상태가 변경되지 않는다.

  • 숫자: int, float
  • 문자열: str
  • 튜플: tuple

interning

python에서는 immutable 객체를 재사용하기 위해 interning이라는 최적화 기법을 사용한다. 이 최적화 기법을 통해 동일한 값을 가진 불변 객체가 여러 번 생성될 때, 하나의 객체를 생성하고 동일한 값을 참조하는 모든 변수가 이 객체를 공유한다.

a = 1
b = 1
print(a is b)  # 출력: True

c = "hello"
d = "hello"
print(c is d)  # 출력: True

mutable 객체

mutable (가변) 객체는 생성도니 후에도 상태가 변경될 수 있다.

  • list
  • dict
  • set

Python의 객체는 immutable, mutable 할 것 없이 모두 객체이며, heap영역에 저장된다.

Dynamic Typing

Python은 dynamic typing(동적 타이핑) 언어이다. 변수의 타입이 실행 시점에 결정되고, 변수에 할당된 객체의 타입에 따라 변경될 수 있다. 변수가 어떤 타입인지는 인터프리터가 처리한다. 변수에 할당된 모든 객체는, 메타데이터를 포함하며, 이 메타데이터에 객체 타입이 포함된다.

Shallow Copy와 Deep Copy

copy()

copy()함수는 shallow copy (얕은 복사)를 수행한다. 객체의 최상위 레벨만 복사한다.

import copy

original_list = [[1, 2], [3, 4]]
shallow_copy = copy.copy(original_list)
original_list ----> [ -------> [1, 2],
                      -------> [3, 4]  ]

shallow_copy  ----> [ -------> [1, 2],   
                      -------> [3, 4]  ]  

shallow_copy의 내부에서는, original_copy의 내부가 가리키는 참조와 동일한 참조값을 저장한다.

deepcopy()

deepcopy() 함수는 deep copy (깊은 복사)를 수행한다. 중첩된 객체까지 모두 새로운 객체로 생성된다.