시리즈 | LLD - 1. 오브젝트란?
일반적으로 프로그래밍에서 리스트는 다음과 같은 종류의 구현체를 가진다.
- Array List
- Linked List
- ...
후에 자세히 설명하겠지만, python에서는 Array List를 이용하여 리스트를 구현한다.그러나 Array List는 각 원소의 크기가 일정해야 하며 이는 가변 크기를 가진 python의 리스트와는 다른 모습이다.
파이썬의 리스트 구현 부분을 보자. [링크]
typedef struct {
PyObject_VAR_HEAD
/* Vector of pointers to list elements. list[0] is ob_item[0], etc. */
PyObject **ob_item;
(...)
Py_ssize_t allocated;
} PyListObject;Copyright (c) Python Software Foundation. Licensed under the PSF License v2.
여기서 눈에 띄는 점은 ob_item이 PyObject**형이라는 점이다.
직관적으로, PyObject는 파이썬 오브젝트라는 점을 의미하고 PyListobject는 PyObject*의 리스트 인 것이다.
CPython 3.13에서는 오브젝트의 layout을 다음과 같이 정의한다.

이 layout에서 오브젝트는 여러 데이터를 포함하며 그 중 refcount의 위치가 오브젝트 포인터가 참조하는 위치임을 알 수 있다.
조금 더 자세하게 알아보기 위해 일부 오브젝트들의 예시를 보자.
파이썬의 가장 기본적인 int형은 다음과 같이 선언되어 있다. [링크]
struct _longobject {
PyObject_HEAD
_PyLongValue long_value;
};
typedef struct _longobject PyLongObject;Copyright (c) Python Software Foundation. Licensed under the PSF License v2.
여기서 PyObject_HEAD 매크로가 눈에 띄는데, 정의를 보면 다음과 같다. [링크]
#define PyObject_HEAD PyObject ob_base;Copyright (c) Python Software Foundation. Licensed under the PSF License v2.
즉, 파이썬 오브젝트들은 모두 PyObject를 struct 내부에 가지고 있으며 struct는 멤버를 정의된 순서대로 배열 하므로,
struct MyObject {
PyObject ob_base;
}
(...)
MyObject* obj;Copyright (c) Python Software Foundation. Licensed under the PSF License v2.
에서 (size_t) obj = (size_t) &obj->ob_base임을 알 수 있다.
따라서 파이썬은 이러한 '유사 상속'을 이용해 Object의 pointer를 저장하면서 이를 PyObject*형으로 관리할 수 있게 한다.
또한 오브젝트를 사용할 경우, 다음과 같이 PyObject*로 캐스팅하여 사용한다. [링크]
/* If a freshly-allocated int is already shared, it must
be a small integer, so negating it must go to PyLong_FromLong */
Py_LOCAL_INLINE(void)
_PyLong_Negate(PyLongObject **x_p)
{
PyLongObject *x;
x = (PyLongObject *)*x_p;
(...)
}Copyright (c) Python Software Foundation. Licensed under the PSF License v2.
Comments ()