본문 바로가기

진리는어디에/Python

[Python] 변수 #3 변수의 다양한 정보 확인

이번 포스트는 [Python] 파이썬 기초부터 시작하기 - 변수에서 연장 되는 잠시 쉬어가는 페이지 정도로 생각하면 된다. 알면 좋지만 모른다고해서 당장 문제 될것은 없으니 이런 것들이 있구나하는 마음으로 가볍에 읽고 나중에 필요 할 때 다시 와서 찾아 보면 된다.

목차

  1. 파이썬 변수의 소개
  2. 변수의 타입
  3. >> 변수의 다양한 정보 확인
  4. ctype 모듈을 활용한 변수의 정보 확인
  5. == 와 is 연산자
  6. mutable 변수와 immutable 변수
  7. 변수의 삭제
  8. 파이썬 정수는 Overflow가 없다?

들어가기 전에

이전 [Python] 파이썬 기초부터 시작하기 - 변수에서 파이썬 변수는 값 자체를 가지고 있는 것이 아니라, 메모리 어딘가에 생성 되어 있는 값을 가진 객체를 참조하는 참조자라고 이야기 했다.

여기서 이야기하는 객체란 무엇인가? 명확한 이름도 없고 그냥 객체라고만 부르니 막연하기만 하다. 객체에 대해서 이해하기 위해 파이썬의 기반 부터 살펴 봐야 한다.

파이썬의 기본은 C 프로그래밍 언어다. 우리가 작성한 스크립트 파일을 해석하고 실행 시켜주는 인터프리터가 C로 만들어져 있다는 뜻이다. 물론 PyPy라던지, Python for .Net, Jython등 여러 언어를 기반반으로 다양한 버전의 파이썬이 나와있지만 근간은 C를 기반으로한 CPython이다.

C 언어 처럼 사용하기 까다로운 프로그래밍 언어를 파이썬 처럼 사용하기 쉬운 - 변수의 타입을 구분할 필요도 없고, 메모리를 직접 관리하다 크래쉬날 일도 없다 - 언어로 만들기 위해 내부적으로 모든 것을 PyObject에서 파생된 객체들을 이용해 관리한다. 

예를 들어 정수형 변수를 만들면 PyLongObject라는 객체가 만들어지고 변수는 그 객체를 가리킨다. 실수형 변수를 만들면 PyFloatPyObject란 객체가 만들어지고 역시 변수는 그 객체를 가리킨다. 각 PyLongObject와 PyFloatObject는 아래 이미지와 같은 구조를 가지는데 녹색으로 표시된 부분이 PyObject로 부터 파생된 부분이고 나머지 부분들은 각 객체의 속성에 맞게 개별 정의된 부분이다.

PyObject란, 객체의 라이프 사이클을 관리하기 위한 ob_refcnt와 객체의 타입을 나타내기 위한 ob_type 두 변수로 이루어진 구조체라고 생각하면 된다.

다양한 정보를 가지고 있는 객체

이번 포스트에서는 이런 객체들의 세부 정보들을 확인하는 방법에 대해 알아 본다.

변수(객체)의 아이디(주소) 확인

n = 10

print(n)
print(id(n))
print(hex(id(n)))
  • id(n) : 객체의 id를 확인하기 위해서는 id 라는 파이썬 표준함수를 사용한다. 여기서 아이디 값은 객체의 주소값을 의미한다.
Tip. 파이썬의 다양한 구현들
우리는 그냥 파이썬이라고 하지만 사실 파이썬은 C로 구현된 CPython, Java로 구현된 Jython, .Net 기반의 Python for .Net. 그외 IronPython, PyPy 등 구현된 기반에 따라 다양한 버전이 존재한다. 본 튜토리얼은 CPython 기반으로 작성 되고 있고 앞에서 언급한 파이썬 객체의 id가 객체의 주소를 이용하는 것은 CPython의 특징이다. 다른 언어 기반의 파이썬은 객체 주소가 아닌 다른 것을 id로 삼을 수도 있다.

위 스크립트의 실행 결과는 아래와 같다.

> python main.py
10
2302216399440
0x21806ca6a50

변수(객체)의 참조 계수 확인

import sys # sys 표준 모듈 import

n = 10
f = 3.4

print(sys.getrefcount(n)) # 변수 n의 참조 계수 출력
print(sys.getsizeof(n)) # 변수 n의 객체 사이즈 출력
print(sys.getsizeof(f)) # 실수형 변수 f의 객체 사이즈 출력
  • sys.getrefcount(n) : 객체의 참조 계수를 반환 한다.
  • sys.getsizeof(n) : 객체의 메모리 크기를 반환 한다.

위 스크립트의 실행  결과는 아래와 같다.

> python main.py
15
28
24

변수(객체)의 타입 조사

isinstance 함수는 변수가 특정 타입인지 그렇지 않은지 조사한다.

n = 10
f = 3.4

print(isinstance(n, int)) # True
print(isinstance(f, int)) # False
  • isinstance(n, 타입) : 첫번째 인자로 지정된 변수의 타입과 두번째 인자로 지정된 타입이 동일하면 True, 그렇지 않다면 False를 리턴한다.

마치며

이상으로 객체의 정보를 조회하는 방법에 대해 간단히 알아 보았다. 다음 포스트 [Python] ctypes 모듈 활용에서는 ctype 모듈을 이용하여 파이썬 표준 함수로는 조사할 수 없는 객체의 정보들을 확인하는 방법에 대해 알아 보도록 하겠다. C에 대한 지식이 없으면 이해하기 어려운 부분이므로 부담스러우신 분들은 [Python] 파이썬 기초부터 시작하기 - == 와 is 연산자 로 바로 넘어 가도 된다.

부록 1. 같이 보면 좋은 글

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