파이썬과 C/C++의 변수 개념 차이
파이썬에서 변수를 다루는 방식은 C/C++와 근본적으로 다릅니다. 이 차이를 이해하면 "파이썬에서 변수에 대한 참조를 만들 수 있는가?"라는 질문에 대한 답이 자연스럽게 보입니다.
C/C++에서의 변수
C/C++에서 변수는 메모리상의 이름이 붙은 위치(named memory location)입니다. 한 변수의 값을 다른 변수에 대입하면, 값이 새로운 메모리 위치에 복사(copy)됩니다.
int x = 5;
int y = x;
C++에서는 & 연산자를 사용해 선언된 변수의 메모리 주소를 확인할 수 있습니다.
cout << x << &x << y << &y;
x와 y가 같은 값을 담고 있더라도, 두 변수는 서로 다른 주소에 저장되어 출력됩니다.
C++의 참조(reference) 변수
C++에서는 변수의 주소를 참조 변수에 저장함으로써 해당 변수의 별칭(alias)을 만들 수 있습니다.
int x = 5;
int &y = x; // y는 x에 대한 참조
y = 10;
cout << x << y;
실행 결과 x와 y 모두 10으로 출력됩니다. 여기서 y는 x 자체를 가리키는 참조이므로, 두 이름은 서로 바꿔 사용할 수 있습니다.
파이썬에서의 변수
반면 파이썬에서 변수는 객체 그 자체가 아니라, 메모리 속 객체에 붙여진 이름(label)에 불과합니다. 어떤 변수의 값을 다른 변수에 대입하면 복사가 일어나는 것이 아니라, 두 이름이 동일한 객체를 함께 참조하게 됩니다.
이 내장 함수 id()를 사용하면 객체의 고유 식별자(메모리 주소에 해당하는 값)를 확인할 수 있습니다.
>>> x = 5
>>> y = x
>>> id(x), id(y)
(1486402752, 1486402752)
x와 y의 id() 반환값이 동일합니다. 즉, 두 변수는 같은 정수 객체 5를 가리키고 있는 것입니다.
결론
파이썬에는 C++처럼 특정 '변수'에 대한 참조를 생성하는 문법이 없습니다. 파이썬의 변수는 애초에 객체를 가리키는 이름일 뿐이며, 대입 연산은 항상 객체에 대한 또 다른 이름을 만들 뿐입니다. 따라서 파이썬에서는 변수 자체에 대한 참조를 만들 수 없습니다. 객체를 공유하고 싶다면 위 예제처럼 단순히 대입하면 되고, 완전히 독립된 복사본이 필요하다면 copy 모듈 등을 활용해야 합니다.