새소식

ML Development/Python - 2022.02.08

[파이썬] 변수(Python vs C++)

  • -

C++의 변수 할당 과정

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 의 주소값이 다른 것을 확인할 수 있다.

이는 메모리를 미리 할당한 다음에, 그 주소에 값을 저장하기 때문이다.

좀 더 이해가 잘 되도록 시각화해보자.

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

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

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

그림 속 박스는 메모리 주소이고, 숫자는 저장된 값이다.

C++에선 고유한 변수의 주소인 박스의 이름은 변하지 않고, 실행마다 만 바뀌는 것을 알 수 있다.

 

Python의 변수 할당 과정

Python의 모든 것은 객체라는 말을 한번 쯤은 들어봤을 것이다.

좀 더 엄밀히 말하면 파이썬의 모든 것은 Heap 영역에 동적으로 할당된 객체를 참고한 것이다.

Introducing Python에선 다음과 같이 설명하고 있다.

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

설명을 잘 이해 했다면 파이썬의 메모리 할당 과정이 결국 아래와 같다는 것을 알게 될 것이다.

변수 선언 : Heap 메모리의 Object를 참조하는 것

추가로 C++에서 a, b 변수를 가지고 확인했던 것처럼, 파이썬에서도 동일한 과정을 반복해보자.

다른 점을 비교하다보면, 더 잘 이해할 수 있을 것이다.

아래와 같은 코드를 입력하면, 파이썬에선 다음과 같은 일이 일어날 것이다.

a = 1
b = a

  1. 1이라는 정수 타입의 객체가 메모리에 할당된다.
  2. 이 객체의 주소에 a라는 변수가 바인딩된다.
  3. 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

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

a = 1
a = 2
b = a

고유한 박스(주소)에 값이 변경됐던 C++과 달리, 파이썬에선 그냥 참조하는 값만 바뀐다.

그림에서 특이한 점은 2가 선언되고 1을 참조하는 변수가 없어지면 자동으로 1이 없어진다는 점이다.

이는 파이썬이 자체적으로 Reference Counting(RC) 방식을 활용해 메모리를 해제하기 때문이다.


참고

 

foobarnbaz.com - Understanding Python variables and Memory Management

Understanding Python variables and Memory Management Jul 08, 2012 Have you ever noticed any difference between variables in Python and C? For example, when you do an assignment like the following in C, it actually creates a block of memory space so that it

foobarnbaz.com

  • 예시로 활용한 그림을 참고했습니다.
 

C++ 01.02 - 변수, 초기화 및 할당 (variables, initialization, and assignment)

01.02 - 변수, 초기화 및 할당 (variables, initialization, and assignment) 객체(Object) C++ 프로그램은 객체를 생성, 접근, 조작 및 파괴한다. 객체는 값을 저장하고 사용할 수 있는 메모리 조각이다. 객체는 정

boycoding.tistory.com

  • C++의 변수 할당 과정을 확인했습니다.
 

[기초 파이썬] 파이썬의 모든 것은 Object이다 (정수편)

C에서 변수가 저장되는 방식 : 변수 = 메모리 C에서 특정한 값이 변수에 저장되는 방식은 간단하다. 예를 들어, 아래와 같은 C코드가 작성되어 있다고 하자. // C 코드 int a = 5; int b = a; 코드를 실행

ahracho.github.io

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.