[Python] 레퍼런스(reference)에 대해서

두비니

·

2021. 4. 10. 14:51

 

 

 

 

안녕하세요, 오늘은 레퍼런스에 대해서 이야기하려고 합니다.

공부하다가 흥미로운 점을 찾아서유

 

0. 레퍼런스란?

 

우선 레퍼런스가 뭔지부터 알아봅시다.

C언어와 달리 Python에서는 "주소"라는 개념이 없습니다. 대신 레퍼런스라는 개념이 있고, 이 레퍼런스를 얻기 위해서는 id()함수를 사용합니다. 아래 정의를 봅시다.

id(object)

Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.



출처:  docs.python.org/3/library/functions.html#id

 

뭐 대충 "주소"를 대신한다는 것을 알 수 있습니다.

근데 여기서 C언어에서 배웠던 "주소"라고만 이해하고 넘기면 나중에 이해가 안되는 부분이 있습니다.

그건 뒤에서 더 자세히 설명할게요.

 

아무튼 이렇게 다른 값을 할당하면, 다른 id가 할당됩니다. 

 

1. C언어와 다른 점

 

아무래도 C언어를 먼저 배워서 C언어의 주소 개념으로 이해했더니 한참을 헤매서 따로 작성합니다.

일단 위에서 말했듯 C언어의 주소와 Python의 id는 전혀 다른 개념입니다.

일단 다음 경우를 봅시다.

 

보면 다른 값이 할당되어있던 a와 b는 각각 다른 레퍼런스 값을 가지고 있었지만, b에 a의 값을 넣어준 뒤로는 레퍼런스의 값이 같아진 것을 볼 수 있습니다.

이 과정을 그림으로 표현해보겠습니다.

 

 

이상태에서 첫 번째 print가 진행되는거고,

 

이 상태에서 두번째 print가 진행됩니다.

보면 알 수 있듯이, c언어처럼 각 변수가 주소를 가지고 뭔가 하는 개념이 아닙니다. 오히려 값들이 레퍼런스 값을 가지고 있고, 변수는 그 레퍼런스 값들을 따라간다고 보면 될 것 같습니다.

 

이렇게 되는 이유는 C언어와 Python이 메모리 관리 방법이 전혀 다르기 때문입니다. 이건 나중에 따로 글을 한번 작성하도록 하겠습니다.

 

개인적으로는 왜 이렇게 설계가 되어있는지 잘 모르겠네요... 이렇게 하면 뭔가 효율성을 높여줄 것 같긴 한데... 뭐 아무튼 C언어랑 똑같이 생각했다가 헤맸네요! 아래 글도 굉장히 잘 쓰여져 있으니 읽어보시는걸 추천드립니다.

 

참고 : codingdog.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-id-%ED%95%A8%EC%88%98-%EA%B0%9D%EC%B2%B4-%EA%B3%A0%EC%9C%A0%EA%B0%92%EC%9D%84-%EC%95%8C%EC%95%84%EC%98%A4%EA%B8%B0-%EC%9C%84%ED%95%B4-%EC%93%B4%EB%8B%A4

 

파이썬 id 함수 : 객체 고유값을 알아오기 위해 쓴다.

 파이썬에는 built in 함수로 id가 있습니다. 문서에 따르면, 이것은 객체의 고유값을 리턴하는 메서드입니다. cpython은 주솟값을 돌려준다고 문서에 언급이 되어 있습니다. 저는 이 메서드를 어떤

codingdog.tistory.com