hotamul의 개발 이야기

진짜 이상한 Python의 del 본문

Dev./Python

진짜 이상한 Python의 del

hotamul 2023. 12. 11. 20:09
>>> number = 123
>>> number
123
>>> del number
>>> number
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'number' is not defined

 

Python에서 del keyword를 사용하면 위와 같이 number은 더 이상 사용할 수 없게 된다. number에 접근하려고 하면 더 이상 해당 변수가 없기 때문에 NameError가 발생한다.

 

하지만 del은 객체를 제거하는 것이 아니라 변수와 같은 reference를 제거하는 것이 주요 목표이다.

다음 이상한 예시를 확인해 보자.

 

>>> class MyClass:
...     def __del__(self):
...             print("MyClass deleted!")
...
>>> a = MyClass()
>>> b = a
>>> del a # 여기서 "MyClass deleted!"가 출력될거 같아!
>>> del b
MyClass deleted!

 

여기서 확인할 수 있는 것은 del은 직접 a.del()을 호출하지 않는다는 것이다. del a를 만나게 되면 Python은 현재 scope에서 이름 a를 삭제하고 a가 참조하는 객체의 reference count를 1만큼 감소시킨다. 즉 del()은 해당 객체의 참조 횟수가 0이 되었을 때만 호출된다.

 

다시 말해 del은 reference count를 감소시키는 역할을 하고 객체 제거는 가비지 컬렉션 시스템을 통해 메모리 해제가 수행된다. (del을 사용한다는 것은 객체의 마지막 reference를 제거할 때만 코드의 메모리 소비를 줄일 수 있게 해 주며, del은 해당 객체가 가비지 컬렉션 될 준비를 하게 해 준다고 할 수 있다.)

 

(하지만 Python의 가비지 컬렉션 시스템은 객체의 마지막 reference를 제거하고 해당 객체의 reference count를 0으로 줄인 후 즉시 메모리를 해제하지는 않는다. 대신 주기적으로 메모리를 검사하여 참조되지 않은 객체를 해제하는 방식으로 동작한다. Python의 자세한 가비지 컬렉션 전략들이나 성능 최적화 방법들이 궁금하다면 고성능 ML 백엔드를 위한 10가지 Python 성능 최적화 팁 | Hyperconnect Tech Blog를 참고하면 많은 도움이 될 것 같다. 나는 많은 도움이 되었다...)

Comments