del 명령은 이름을 제거하는 것인지, 객체를 제거하는 것이 아니라 del 명령의 결과로 객체가 가비지 컬렉트될 수 있지만, 제거된 변수가 객체를 참조하는 최후의 변수거나 객체에 도달할 수 없을 때만 가비지 컬렉트되므로 변수를 다시 바인딩해도 객체에 대한 참조 카운트를 0으로 만들어 객체가 제거될 수 있다.
CPython의 경우 가비지 컬렉션은 주로 참조 카운트에 기반하여 본질적으로 각 객체는 얼마나 많은 참조가 자신을 가리키는지 개수를 세어서 refcount가 0이 되자마자 CPython이 객체의 del() 메서드를 호출하고 객체에 할당되어 있는 메모리를 해체함으로써 객체가 제거된다.
참고로, CPython엔 순환 참조에 관련된 객체 그룹을 탐지하기 위해 세대별 가비지 컬렉션 알고리즘을 추가하여 다른 파이썬 구현에서는 참조 카운트에 기반하지 않는 더 정교한 가비지 컬렉터를 사용하므로 객체에 대한 참조가 모두 사라진 경우에도 del()메서드가 바로 호출되지 않을 수 있다.
#객체가 소멸될 때를 보여주기 위해서 weakref.finalize()를 사용해서 객체가 소멸될 때 호출되는 콜백 함수를 등록한다.
#가리키는 참조가 없을 때 객체가 소멸되는 것을 지켜보기
import weakref
s1 = {1,2,3}
s2 = s1
def bye():
print('Gone with the wind...')
encoder = weakref.finalize(s1,bye)
encoder.alive
del s1
encoder.alive
s2='spam'
encoder.alive
"""
del이 객체를 제거하는 것이 아니고, del을 실행한 후 객체가 도달할 수 없게 된 결과로 객체가 제거됨을 명확히 보여준다.
"""
del은 객체를 제거하는 것이 아니고, del을 실행한 후 객체가 도달할 수 없게 된 결과로 객체가 제거됨을 명확히 보여주고, {1,2,3}튜플 객체가 제거된 이유는 약한 참조를 갖고 있기 때문이고 이건 다음 포스팅에서 알아보자.