본문 바로가기
개발

파이썬에서 참조(reference)가 헷갈리는 이유

by Kyutree 2026. 2. 3.

파이썬을 처음 배우는 개발자들이 흔하게 겪는 어려움 중 하나는 바로 '참조(reference)' 개념입니다.

왜 이렇게 헷갈릴까요?

겉으로는 간단해 보이는 파이썬의 변수 할당 방식이, 실제로는 C언어와는 다른 독특한 방식으로 작동하기 때문입니다.

이 글에서는 파이썬의 참조가 왜 헷갈리는지, 그리고 어떻게 하면 이 개념을 명확하게 이해할 수 있는지 자세히 살펴보겠습니다.

 

파이썬은 Call by Object Reference?

 

파이썬은 "Call by Object Reference" 또는 "Call by Assignment" 방식을 사용합니다.

이 말은 함수에 인자를 전달할 때, 객체의 "값" 자체를 넘기는 것이 아니라 객체의 "참조"를 넘긴다는 의미입니다.

여기서 중요한 점은 넘겨지는 객체가 "mutable(가변)"한 객체인지, "immutable(불변)"한 객체인지에 따라 동작 방식이 달라진다는 것입니다.

예를 들어, 리스트(list)와 같은 mutable 객체를 함수에 넘기면, 함수 내에서 리스트를 변경했을 때 원본 리스트도 함께 변경됩니다.

반면에 정수(int)나 문자열(string)과 같은 immutable 객체를 넘기면, 함수 내에서 값을 변경해도 원본 객체는 변하지 않습니다.

이러한 동작 방식의 차이가 파이썬의 참조 개념을 더욱 복잡하게 만듭니다.

 

변수는 레이블이다?

 

파이썬에서 변수는 단순히 객체에 붙여진 "레이블"이라고 생각하는 것이 더 정확합니다.

즉, 변수는 특정 메모리 주소를 가리키는 포인터가 아니라, 객체를 식별하는 이름표와 같습니다.

하나의 객체에 여러 개의 레이블(변수)을 붙일 수 있는데, 이를 "aliasing(앨리어싱, 별명)"이라고 합니다.

앨리어싱은 예상치 못한 side effect를 발생시킬 수 있습니다.

예를 들어, `a = [1, 2, 3]`이라고 했을 때, `b = a`라고 하면 `a`와 `b`는 같은 리스트 객체를 가리키게 됩니다.

따라서 `b[0] = 100`이라고 변경하면 `a`도 `[100, 2, 3]`으로 변경됩니다.

이러한 앨리어싱 현상은 특히 리스트나 딕셔너리와 같은 mutable 객체를 다룰 때 주의해야 합니다.

 

복사(Copy) vs 참조(Reference)

 

파이썬에서 객체를 복사하는 방법에는 크게 두 가지가 있습니다.

바로 "얕은 복사(shallow copy)"와 "깊은 복사(deep copy)"입니다.

얕은 복사는 새로운 객체를 생성하지만, 내부의 객체들은 원본 객체와 같은 참조를 공유합니다.

반면에 깊은 복사는 새로운 객체를 생성하고, 내부의 객체들까지 모두 재귀적으로 복사합니다.

`my_list.copy()`와 같은 방법은 얕은 복사를 수행합니다.

따라서 `my_list` 내부의 객체가 mutable하다면, 복사된 리스트를 변경했을 때 원본 리스트도 영향을 받을 수 있습니다.

깊은 복사를 위해서는 `copy` 모듈의 `deepcopy()` 함수를 사용해야 합니다.

복사는 새로운 메모리 위치에 동일한 내용을 복사한 새 객체를 생성하는 것입니다.

`my_list.copy()`를 사용하면 두 리스트는 같은 값을 가지지만 서로 다른 메모리에 위치하여 `my_list`의 값을 수정해도 `new2_list`의 값은 변하지 않습니다.

 

id() 함수의 역할

 

C언어와 달리 파이썬에는 "주소"라는 개념이 직접적으로 존재하지 않습니다.

대신 "레퍼런스"라는 개념이 있으며, 이 레퍼런스를 얻기 위해서는 `id()` 함수를 사용합니다.

`id()` 함수는 객체의 고유한 identity 값(정수)을 반환합니다.

이 값은 객체가 메모리에 존재하는 동안에는 유일하게 유지됩니다.

C언어처럼 각 변수가 주소를 가지고 뭔가 하는 개념이 아니라, 값들이 레퍼런스 값을 가지고 있고, 변수는 그 레퍼런스 값들을 따라간다고 보면 됩니다.

`id()` 함수를 통해 변수가 실제로 같은 객체를 가리키고 있는지, 아니면 서로 다른 객체를 가리키고 있는지 확인할 수 있습니다.

 

Mutable vs Immutable

 

파이썬에서 mutable한 객체와 immutable한 객체의 차이를 이해하는 것은 참조 개념을 이해하는 데 매우 중요합니다.

Mutable한 객체는 값을 변경할 수 있는 객체를 의미하며, 대표적으로 리스트(list), 딕셔너리(dictionary), 집합(set) 등이 있습니다.

Immutable한 객체는 값을 변경할 수 없는 객체를 의미하며, 대표적으로 정수(int), 실수(float), 문자열(string), 튜플(tuple) 등이 있습니다.

Mutable한 객체를 다룰 때는 앨리어싱과 복사에 더욱 주의해야 합니다.

함수 인자로 mutable 객체를 넘길 때, side effect가 발생할 가능성을 항상 염두에 두어야 합니다.

 

파이썬의 참조 개념은 처음에는 어렵게 느껴질 수 있지만, 변수가 레이블이라는 점, mutable/immutable 객체의 차이, 복사 방식 등을 명확히 이해하면 충분히 극복할 수 있습니다.

`id()` 함수를 활용하여 객체의 identity 값을 확인하고, 앨리어싱과 side effect에 주의하며 코드를 작성하는 습관을 들이세요.

무엇보다 중요한 것은 직접 코드를 작성하고 실행하면서 파이썬의 참조 동작 방식을 체득하는 것입니다.

꾸준히 연습하다 보면 어느새 파이썬의 참조 개념이 자연스럽게 이해될 것입니다.