파이썬 메모리 관리(sys.getrefcount, id 함수 사용)

파이썬에서 변수에 값이 저장되는 방식(메모리 관리)


파이썬에서 변수에 값을 지정했을 때 메모리에 어떻게 저장될까요?

파이썬의 값 자체도 객체(Object)입니다. 변수에 값이 저장되는 것이 아니고 변수가 객체를 가르키고 있는 것입니다. (C언어의 포인터와 동일한 개념입니다.)


예를들어 x = 500 이라고 선언했을 때 메모리에서는 무슨일이 일어날까요. 100이라는 객체는 메모리 어딘가 저장되어 있고 x라는 변수는 화살표로 500을 pointing 하고 있는 것입니다.


추상적인 개념의 이해를 돕기 위해 몇가지 파이썬 코드를 보겠습니다.



객체의 참조 횟수 확인 (sys.getrefcount( ))


sys.getrefcount 함수를 사용해보겠습니다. 이 함수는 해당 객체의 reference count를 출력해줍니다. 즉, 참조(포인트)된 횟수를 나타내줍니다.

최초의 count는 os마다 차이가 있으니 참고바랍니다. (그럼 count 1은 뭐냐! 궁금해하실수도 있는데 핵심은 아니니 넘어가겠습니다.) linux, mac os 최초 count : 3 window : 2


import sys

# 객체 200의 reference count 확인
print(sys.getrefcount(500))
a = 500
print(sys.getrefcount(500))
b = 500
print(sys.getrefcount(500))
c = b
print(sys.getrefcount(500))


# 객체 500의 reference count 확인
print(sys.getrefcount(1600))
x = 1600
print(sys.getrefcount(1600))
y = 1600
print(sys.getrefcount(1600))
z = x
print(sys.getrefcount(1600))


결과 값

3
4
5
6

3
4
5
6

즉, 500이라는 객체는 메모리 어딘가에 저장되어 가만히 있고 객체 a가 500을 포인팅하고 b가 앞과 “동일한” 500을 포인팅하고 c가 또 “동일한” 500을 포인팅 하는 것입니다.



객체의 주소값 확인 (id( ))


a, b, c가 같은 500을 가리키는게 맞는지 코드로 증명해보겠습니다. id 함수를 사용해서 객체 500과 1600의 실제 메모리 주소를 출력해보겠습니다.

# 객체 500의 주소값 출력
print(id(500))
print(id(a))
print(id(b))
print(id(c))


# 객체 1600의 주소값 출력
print(id(1600))
print(id(x))
print(id(y))
print(id(z))


결과 값

140355471365264
140355471365264
140355471365264
140355471365264

140355471365424
140355471365424
140355471365424
140355471365424


보시다시피 객체 500과 a, b, c 모두 동일하게 주소값 140355471365264 이 출력되었습니다. 즉 a, b, c는 모두 동일한 500이라는 객체를 가르키고 있는 것입니다.

업데이트:

댓글남기기