이번 포스트는 변수의 이름을 삭제하는 del 키워드에 대해 살펴본다. 이 포스트의 내용을 이해하기 위해서는 파이썬 변수가 참조자의 역할을 하고 있다는 것을 알고 있어야 한다. 해당 내용은 [Python] 파이썬 기초부터 시작하기 - 변수를 참고하도록 하자.
목차
- 파이썬 변수의 소개
- 변수의 타입
- 변수의 다양한 정보 확인
- ctype 모듈을 활용한 변수의 정보 확인
- == 와 is 연산자
- mutable 변수와 immutable 변수
- >> 변수의 삭제
- 파이썬 정수는 Overflow가 없다?
del 키워드
변수의 이름을 삭제 할 때 사용하는 키워드다. 단, 객체 자체를 삭제하는 것이 아니라 "변수의 이름만 제거"하고 "객체의 참조 계수를 감소" 시킨다.
import sys
n1 = 100
n2 = n1
print(sys.getrefcount(n1))
del n2
print(sys.getrefcount(n1))
print(n2)
위 예제의 6라인까지 실행 했을때 메모리를 살펴 보자면 아래와 같은 모습일 것이다.
변수 n1과 n2는 동일한 객체를 가리키고 있으며, 객체에는 현재 자신을 가리키고 있는 변수가 2개가 있다는 의미로 ref_cnt가 2로 설정 되어 있다(사실 파이썬 내부에서 정수형 객체를 특별하게 취급하여 실질적으로는 getrefcount의 결과 값으로 2보다 더 큰값이 리턴 되지만 개념적으로 2라고 생각하도록 하자).
그리고 8라인에서 변수 n2를 더 이상 사용하지 않겠다고 del 키워드를 사용하여 변수를 지워 버리면 아래와 같은 모습이 된다.
유의해야 할 사항은 del 키워드는 변수가 가리키는 객체를 삭제하는 것이 아니라 객체에 대한 참조만을 감소 시킬 뿐이다. 객체의 삭제는 ref_cnt가 0이 되었을 때 파이썬의 가비지 콜렉터에 의해 자동으로 삭제 된다.
10라인까지 실행 되었을 때 객체의 참조카운트가 이전에 출력 된것보다 하나 줄었음을 알 수 있다.
그리고 11라인의에서 지워진 n2변수의 값을 출력하고자 하면 아래와 같이 정의 되지 않은 변수를 읽으려고 한다고 오류를 발생 시킨다.
> python main.py
8
7
Traceback (most recent call last):
File "D:\main.py", line 11, in <module>
print(n2)
NameError: name 'n2' is not defined
더 이상 변수를 사용지 않고자 할 때 del 키워드를 이용하여 변수들을 정리해 줄 수 있다.
마치며
이제 거의 변수 관련 강의의 마지막이 다가온다. 다음 강의는 부록 형식으로써 파이썬에서 오버플로우 없이 정수를 처리하는 방법에 대해 알아 보도록 하겠다.