3

作为最近一直在尝试 Python C-API 的人,我很好奇PyVarObject文档说它PyObject专门用于定义可变长度类型的子类型——尽管需要注意的是:

这种类型在 Python/C API 中不常出现

... 有大量记录在案的支持结构插槽挂钩和其他 API 细节,以至于PyVarObject我真的很好奇是否存在任何 Python-API 相关的问题(但特别是利基)缓解解决方案。

4

1 回答 1

1

它主要用于不可变的容器类型(例如tuplebytes)。这个想法是,该类型的末尾可以有一个包含其所有数据的数组。当它被分配(具有PyObject_NewVar或类似的)额外空间时,会为它将包含的(不可变的)数据分配额外的空间,这简化了内存管理,并且可能只需要进行一次内存分配就可以获得一点速度。因为大小在构造后永远不会改变,所以它可以采用这种快捷方式,而不必担心通过重新分配内存来使对它的引用无效。

尽管是可变的,但稍微混淆事物的列表也是一个。PyVarObject但是,它的项目大小为 0,因此在对象末尾实际上没有分配额外的空间。相反,它存储一个指向 的数组的指针PyObject*,分别分配(如果列表增长,则可以重新分配而不会使对列表的引用无效)。据推测,它PyVarObject只是为了拥有一个ob_size领域。

于 2016-04-24T13:04:25.330 回答