Python은 C 언어와 달이 포인터라는 개념이 없다. 하지만 컴퓨터 상에서 돌아가는 언어이기 때문에 내부적으로는 메모리를 사용하고, 이에 대한 주소 정보를 가지고 있다. 


그렇다면 포인터 개념을 사용하지 않는 Python에서 해당 메모리 주소는 어떤 용도로 사용되는 것일까?


Python은 메모리 주소를 변수를 구별하기 위한 용도로 사용하고 있다. 


python의 built-in 함수 중 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.


CPython implementation detail: This is the address of the object in memory.


아래와 같이 변수 a 에  "String" 문자열을 할당하고 id 로 그 주소를 확인해 보면 숫자로된 주소값을 확인 할 수 있다. 

>>> a = "String"
>>> id(a)
140064728332080


하나 특이한 점으로 다른 이름의 변수 b를 선언하고 동일한 내용의 문자열을 할당해도 별도의 메모리를 사용하는게 아니라 기존의 동일 문자열의 메모리를 사용하는 것을 확인할 수 있다는 점이다. 


만약 둘 중 한 변수의 값이 변하게 되면 변하게 되는 변수는 변한 값을 다른 메모리 주소로 옮긴다. 옮겨진 변수의 값은 나중에 수정되어 내용이 전과 같아지더라도 메모리 위치는 기존과는 달라져 있는 것을 확인할 수 있다. 


>>> a = "String"
>>> id(a)
140064728332080
>>>
>>> b = "String"
>>> id(b)
140064728332080
>>>
>>> b += "1"
>>> b = b[:-1]
>>> b
'String'
>>> id(b)
140064728332416