[Python] 파이썬 이해하기

woodywarhol9·2021년 7월 7일
0

Python

목록 보기
2/2

아래 링크를 참조하여 공부 목적으로 작성한 글입니다.

Understanding Python variables and Memory Management
파이썬의 모든 것은 Object이다
파이썬 Object Interning
python 메모리 관리
C++ 변수, 초기화 및 할당


C++을 얕게 알고 있다보니 Python 공부하면서 자꾸만 혼동되는 내용이 있어 관련된 내용을 모아 정리해 본다.

1. 변수 차이

C++에서 int형 변수를 선언한 후 값을 저장하고 이를 다른 변수에도 저장하는 과정은 다음과 같다.

int a = 1;
int b = a;

  1. 4 Byte(int) 만큼의 메모리를 할당한 후 a라고 이름 붙인다.
  2. a에 5를 저장한다.
  3. 다시 4 Byte 만큼의 메모리를 할당한 후 b라고 이름 붙인다.
  4. a에 저장된 5를 b에 저장한다.

메모리를 확인하면 다음과 같다.
    int a = 1;
    int b = a;
    
    cout<<&a<<endl;
    cout<<&b<<endl;
    
    => 0x7ffc36eef698
       0x7ffc36eef69c

변수 b와 a의 주소값은 다르다. 왜 Why?(🐿️) 각 변수에 주소가 할당되기 때문이다.
아래 예시를 보면 이해하기 쉽다.

    int a = 1;
    a = 2;
    int b = a;
 

위 코드를 실행하면서 생기는 단계별 변화를 그림으로 표현했다.




고유한 변수의 주소인 박스의 이름은 변하지 않고 그때 그때 실행마다 내용물(값)만 바뀐다.


그럼 Python에선 어떻게 변수가 선언되고 할당될까.


파이썬에서는 모든 것(부울, 정수, 실수, 문자열, 데이터 구조, 함수, 프로그램)이 객체(Object)로 구현되어 있다. … 파이썬 변수의 핵심을 살펴보자. 변수는 단지 이름일 뿐이다. 할당한다는 의미는 값을 복사하는 것이 아니다. 데이터가 담긴 객체에 그냥 이름을 붙이는 것이다. 그 이름은 객체 자신에 포함되는 것이라기보다는 객체의 참조다. 이름을 포스트잇처럼 생각하자. (Introducing Python p.42-43)

Python에선 메모리 상에 할당된 객체를 a와 b라는 변수가 가리키게 된다. 변수만의 고유의 메모리는 존재하지 않는다. 변수 a,b에 5라는 값을 할당하는 과정은 다음과 같다.

a = 1
b = a

  1. 1이라는 정수 타입의 객체가 메모리에 할당된다.
  2. 이 객체의 주소를 a라는 변수가 바인딩한다.
  3. b는 a가 가리키는 대상을 바인딩한다.

같은 주소를 가리키기 때문에 a, b ,1 의 id를 구하면 모두 같은 결과가 나오게 된다.

 x = 1
 y = x
 id(1)
140706521527120
 id(x)
140706521527120
 id(y)
140706521527120

이번에도 예시를 통해 확인해보자.

    a = 1
    a = 2
    b = a

위 코드를 실행하면서 생기는 단계별 변화를 그림으로 표현했다.



고유한 객체에 변수들이 할당된다. 이때 1에 할당되는 변수가 없어지자 1은 없어지게 되는데 이는 Python이 메모리 관리를 하기 때문이다.

C++에선 변수가 Python에선 변수가 바인딩된 객체가 고유하다.
따라서 C++에서 변수에 저장된 값이 같더라도 주소값은 다르며 Python에선 객체마다 주소 값이 다르다.


2. 객체 재사용

Python에선 값이 변경되지 않는 immutable 객체의 경우 이미 생성된 객체를 재사용해 메모리 사용을 줄일 수 있다. 이와 같은 방법을 Object Interning라고 하며 CPython의 경우 아래 조건에 해당될 경우 진행한다.

str : 20자 미만의 공백을 포함하지 않는 문자열
int : -5 부터 256 사이의 정수

코드를 통해 확인하면 다음과 같다.

i = 10
j = 10
print(id(i), id(j), i is j) #2008444256 2008444256 True
 
x = 257
y = 257
print(id(x), id(y), x is y) #2611825055632 2611825055568 False

int가 설정한 범위를 넘어가자 Object Interning이 되지 않아 id값이 서로 다름을 확인할 수 있다.

0개의 댓글