# 在 heap 上分配物件

PyObject *_PyObject_New(PyTypeObject *type)
  回傳值：新的參照。

PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)
  回傳值：新的參照。

PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)
  回傳值：借用參照。 為 穩定 ABI 的一部分.

  Initialize a newly allocated object op with its type and initial reference. Returns the initialized object. Other fields of the object are not affected.

PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
  回傳值：借用參照。 為 穩定 ABI 的一部分.

  它會做到 `PyObject_Init()` 的所有功能，並且會初始化一個大小可變物件的長度資訊。

PyObject_New(TYPE, typeobj)

  使用 C 結構型別 TYPE 和 Python 型別物件 typeobj (`PyTypeObject*`) 分配一個新的 Python 物件。未在該 Python 物件標頭 (header) 中定義的欄位不會被初始化；呼叫者會擁有那個對於物件的唯一參照（物件的參照計數為一）。記憶體分配大小由 type 物件的 `tp_basicsize` 欄位來指定。

  Note that this function is unsuitable if typeobj has `Py_TPFLAGS_HAVE_GC` set. For such objects, use `PyObject_GC_New()` instead.

PyObject_NewVar(TYPE, typeobj, size)

  使用 C 的結構型別 TYPE 和 Python 的型別物件 typeobj (`PyTypeObject*`) 分配一個新的 Python 物件。未在該 Python 物件標頭中定義的欄位不會被初始化。記憶體空間預留了 TYPE 結構大小再加上 typeobj 物件中 `tp_itemsize` 欄位提供的 size (`Py_ssize_t`) 欄位的值。這對於實現如 tuple 這種能夠在建立期間決定自己大小的物件是很實用的。將欄位的陣列嵌入到相同的記憶體分配中可以減少記憶體分配的次數，這提高了記憶體管理的效率。

  Note that this function is unsuitable if typeobj has `Py_TPFLAGS_HAVE_GC` set. For such objects, use `PyObject_GC_NewVar()` instead.

void PyObject_Del(void *op)

  釋放由 `PyObject_New` 或者 `PyObject_NewVar` 分配給物件的記憶體。這通常是在物件型別所指定的 `tp_dealloc` handler 中呼叫。呼叫這個函式以後，物件的各欄位都不可以被存取，因為原本分配的記憶體已不再是一個有效的 Python 物件。

PyObject _Py_NoneStruct

  這個物件像是 Python 中的 `None`。它只應該透過 `Py_None` 巨集來存取，該巨集的拿到指向該物件的指標。

也參考

`PyModule_Create()`

  分配記憶體和建立擴充模組。