본문 바로가기

진리는어디에/Python

[Python] 변수 #7 변수 삭제 del

이번 포스트는 변수의 이름을 삭제하는 del 키워드에 대해 살펴본다. 이 포스트의 내용을 이해하기 위해서는 파이썬 변수가 참조자의 역할을 하고 있다는 것을 알고 있어야 한다. 해당 내용은 [Python] 파이썬 기초부터 시작하기 - 변수를 참고하도록 하자.

목차

  1. 파이썬 변수의 소개
  2. 변수의 타입
  3. 변수의 다양한 정보 확인
  4. ctype 모듈을 활용한 변수의 정보 확인
  5. == 와 is 연산자
  6. mutable 변수와 immutable 변수
  7. >> 변수의 삭제
  8. 파이썬 정수는 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 키워드를 이용하여 변수들을 정리해 줄 수 있다.

마치며

이제 거의 변수 관련 강의의 마지막이 다가온다. 다음 강의는 부록 형식으로써 파이썬에서 오버플로우 없이 정수를 처리하는 방법에 대해 알아 보도록 하겠다.

부록 1. 같이 읽으면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!