실제로 발생할 수 있음. 대강은 알고있었는데, 이번에 기회가 되어서 글로 정리함.

미리 머리속에서 들고가야 할것들

파이썬은 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, ..... } 식으로 저장된다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8b663176-207c-49f9-9a04-bb8c5f077650/Untitled.png

우리는 파이썬의 모든 객체는 PyObject로 내부에 표현되고, 그것들은 다시 dict에 저장된다는것을 알게 되었다. dict은 hashmap의 구현체이라는것 까지 봤다.