实际使用PyVarObject,cpython的PyObject

时间:2016-04-22 14:39:32

标签: python c python-c-api cpython pyobject

作为最近一直使用Python C-API的人,我对PyVarObject感到好奇,the documentation saysPyObject的子类型,专门用于定义可变长度类型 - 尽管需要注意:

  

此类型通常不会出现在Python / C API

...有大量有记录的support structuresslot hooks和其他专注于PyVarObject的API细节,如果有任何Python,我真的很好奇与API相关的问题(特别是利基)可以显着简化解决方案。

1 个答案:

答案 0 :(得分:1)

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

稍微混淆一些事情list尽管是可变的,但也是PyVarObject。但是,它有an item size of 0,因此实际上没有在对象的末尾分配额外的空间。相反,它存储指向单独分配的PyObject*数组的指针(如果列表增长,则可以重新分配,而不会使对列表的引用无效)。据推测,只有PyVarObject才有ob_size字段。