본문 바로가기
개발 공부/Python

Python은 변수를 어떻게 저장하는가?

by 느림보어른 2021. 8. 16.

객체(objects)

Python을 배울 때 '객체(Objects)'란 단어가 빈번히 나온다. 사전에서 명시한 Object는 물체를 의미한다. 물체의 특성은 구체적인 형태를 가지고 있다는 것이다.

 

Python에서 정의하는 객체도 이와 유사하다. 객체(Objects)는 파이썬이 데이터(data)를 추상화한 것(abstraction)이며 아이덴티티(identity), 형(type), 값(value)을 갖는다.

위의 내용을 요약하자면 객체(Objects)는 자료형(type)을 가지며 메모리(저장 공간)을 차지한다고 할 수 있다. 즉, 변수를 선언하면 선언한 값이 자료형에 따른 메모리 공간을 차지하며 저장되고 변수는 생성한 메모리 공간의 주소(identity)를 참조한다고 할 수 있다.

 

따라서 Python의 변수는 값을 가지는 것이 아니라 생성한 객체의 주소를 참조한다고 정리할 수 있다.

 

예시

n = 1
def put_id():
    x = 1
    print(f'id(x) = {id(x)}')
    
print(f'id(1) = {id(1)}')
print(f'id(n) = {id(n)}')
put_id()
==============================
id(1) = 1946424338736
id(n) = 1946424338736
id(x) = 1946424338736

위의 코드를 보면 n, x가 참조하는 객체 1의 id가 전부 동일함을 알 수 있다. 결국 변수 n, x는 int형 객체 1을 참조하는 이름일 뿐이다.

 

for i in range(1, 101):
    print(f'i = {i:3}   id(i) = {id(i)}')
=========================================
i =   1   id(i) = 2060212005168
i =   2   id(i) = 2060212005200
i =   3   id(i) = 2060212005232
i =   4   id(i) = 2060212005264
(생략)

다른 예시인 위의 코드를 보자면 i변수의 id가 계속 변하는 것을 볼 수 있다. 즉, id가 가리키는 메모리공간에서 값이 변하는 것이 아니라 i가 나타낼 값이 저장된 객체의 id를 참조한다고 볼 수 있다.

주의할 점

같은 값을 가졌다고 해서 모두 동일한 object를 가리키는 것은 아니다.

>>> a = 300
>>> b = 300
>>> id(a)
2060247813904
>>> id(b)
2060247813808

 

Python은 -5에서 256 사이의 모든 정수에 대한 정수 객체 배열을 유지합니다.이 범위에 인트를 만들 때 실제로 기존 객체에 대한 참조를 다시 가져온다. 따라서 해당 범위를 넘어서는 값을 변수로 선언할 경우 참조하는 객체가 다를 수 있다.

자료형마다 다른 메모리 공간

>>> import sys
>>> a = 1
>>> b = 1.0
>>> c = '1'
>>> print(type(a), sys.getsizeof(a))
<class 'int'> 28
>>> print(type(b), sys.getsizeof(b))
<class 'float'> 24
>>> print(type(c), sys.getsizeof(c))
<class 'str'> 50

같은 자료형이면서 다른 값을 가져도 다른 메모리 공간을 가진다.

>>> import sys
>>> a = '1'
>>> b = '11'
>>> c = '111'
>>> print(sys.getsizeof(a))
50
>>> print(sys.getsizeof(b))
51
>>> print(sys.getsizeof(c))
52

다른 언어와 비교

C언어 변수 선언

C언어의 경우 변수를 선언할 때 변수형도 같이 지정해주고 해당하는 변수형만큼 메모리를 할당해주어 거기에 값을 저장한다. 또 C언어의 경우 함수 내부에서 선언한 지역 변수는 함수가 실행될 때 생성되고 종료할 때 소멸되지만 파이썬은 함수가 종료된다고 해서 객체가 소멸하지 않는다.

참고

https://docs.python.org/ko/3/reference/datamodel.html

 

3. 데이터 모델 — Python 3.9.6 문서

클래스는 특별한 이름의 메서드들을 정의함으로써 특별한 문법 (산술 연산이나 인덱싱이나 슬라이딩 같은)에 의해 시작되는 어떤 연산들을 구현할 수 있습니다. 이것이 연산자 오버 로딩 (operato

docs.python.org

 

'개발 공부 > Python' 카테고리의 다른 글

pop(0)와 pop()의 차이  (0) 2021.08.17
len()의 시간 복잡도가 O(1)인 이유  (0) 2021.08.17
Python - del  (0) 2021.08.16