실제로 발생할 수 있음. 대강은 알고있었는데, 이번에 기회가 되어서 글로 정리함.
파이썬은 C나 C++같은 컴파일 언어가 아님. 즉슨, 함수나 클래스, 인스턴스, 타입들이 모두 동적으로 생성되어 등록되는 구조임.
Python은 내부적으로 PyObject라는 객체를 이용하여 모든 데이터(오브젝트)를 모아둠. 물론 파이썬 전면에서는 보이지 않음. 이 부분은 Python의 소스코들 까봐야 알 수 있는 부분임. 예를들어 아래와 같은 코드를 작성한다고 하면...
a = class()
def func():
pass
이것들은 모두 PyObject로 표현되어 Python 인터프리터 내부에 저장됨. [https://github.com/python/cpython/blob/main/Include/object.h, https://docs.python.org/ko/3/c-api/structures.html] 공통의 객체로 내부에서 저장되기 때문에 여기서 부르고 저기서 부르고, 타입 상관없이 왔다갔다 시킬 수 있는것. 함수 또한 PyObject 형식으로 감싸져있기에 일급객체로 표현될 수 있음 - 자바로 치면 자바의 모든 데이터는 Object형인것과 동일함
def a():
pass
def b(func):
func()
b(a) #C나 C++에서는 할 수 없는 일이다. 함수 포인터를 넘기는건 가능해도 함수 자체를 건내준다니..
#Python에서는 함수도 PyObject이기에 실제로는 함수를 넘긴게 아니라 객체를 하나 넘겨준 것 뿐임.
이게 이 글의 핵심이다. 파이썬이 컴파일 언어였으면 stack등에 직접 저장되었을것이다. 그러나 파이썬은 동적 인터프리터 언어이다. 즉슨, 동적으로 모든것을 저장해야 한다. 그렇기에 스택에는 저장할 수 없다.
파이썬은 이 객체들을 저장하기 위해 dictionary를 이용한다. C나 C++에 친숙하다면... 공통의 HashMap에 데이터를 때려박는다고 생각하면 된다.
a = True
b = True
이런 코드가 있을때, global dict을 까보면 { a: True, b: True, ..... } 식으로 저장된다.
우리는 파이썬의 모든 객체는 PyObject로 내부에 표현되고, 그것들은 다시 dict에 저장된다는것을 알게 되었다. dict은 hashmap의 구현체이라는것 까지 봤다.