파이썬에서는 모든 것(부울, 정수, 실수, 문자열, 데이터 구조, 함수, 프로그램)이 객체(Object)로 구현되어 있다. … 파이썬 변수의 핵심을 살펴보자. 변수는 단지 이름일 뿐이다. 할당한다는 의미는 값을 복사하는 것이 아니다. 데이터가 담긴 객체에 그냥 이름을 붙이는 것이다. 그 이름은 객체 자신에 포함되는 것이라기보다는 객체의 참조다. 이름을 포스트잇처럼 생각하자. (Introducing Python p.42-43)
설명을 잘 이해 했다면 파이썬의 메모리 할당 과정이 결국 아래와 같다는 것을 알게 될 것이다.
추가로 C++에서 a, b 변수를 가지고 확인했던 것처럼, 파이썬에서도 동일한 과정을 반복해보자.
다른 점을 비교하다보면, 더 잘 이해할 수 있을 것이다.
아래와 같은 코드를 입력하면, 파이썬에선 다음과 같은 일이 일어날 것이다.
a = 1 b = a
1이라는 정수 타입의 객체가 메모리에 할당된다.
이 객체의 주소에 a라는 변수가 바인딩된다.
b 는 a 가 가리키는 대상과 동일한 곳에 바인딩된다.
결국 파이썬에서 변수 a, b를 선언하는 것은 Heap 영역의 객체를 바인딩하는 것에 불과하다.
그래서 당연히 변수만의 고유의 메모리가 존재하지 않는다.
왜? Heap 영역에 있는 객체를 가리키기만 하면 되니까.
실제로 변수 a, b와 1(객체) 의 id를 구하면 모두 같은 결과가 나오게 되는 것을 알 수 있다.
x = 1
y = x
id(1)
140706521527120
id(x)
140706521527120
id(y)
140706521527120
앞서 C++에서 박스와 숫자를 가지고 과정을 변수 할당을 확인했었다.
이번엔 파이썬의 변수 할당 과정을 그림으로 살펴보자. 파이썬에선 박스 대신 이름표를 사용해서 과정을 나타냈는데, 이는 고유한 주소를 가지지 않고 바인딩하는 것에 불과한 파이썬의 변수 할당을 더 잘 보여준다.
a = 1
a = 2
b = a
위 코드를 실행하면서 생기는 단계별 변화를 그림으로 표현하면 다음과 같다.
고유한 박스(주소)에 값이 변경됐던 C++과 달리, 파이썬에선 그냥 참조하는 값만 바뀐다.
그림에서 특이한 점은 2가 선언되고 1을 참조하는 변수가 없어지면 자동으로 1이 없어진다는 점이다.
이는 파이썬이 자체적으로 Reference Counting(RC) 방식을 활용해 메모리를 해제하기 때문이다.