作为最近一直使用Python C-API的人,我对PyVarObject
感到好奇,the documentation says是PyObject
的子类型,专门用于定义可变长度类型 - 尽管需要注意:
此类型通常不会出现在Python / C API
中
...有大量有记录的support structures,slot hooks和其他专注于PyVarObject
的API细节,如果有任何Python,我真的很好奇与API相关的问题(特别是利基)可以显着简化解决方案。
答案 0 :(得分:1)
它主要用于不可变容器类型(例如tuple和bytes)。我们的想法是,类型的末尾可以包含一个包含其所有数据的数组。当它被分配(用PyObject_NewVar
或类似的)时,它将为它将包含的(不可变)数据分配额外的空间,这简化了内存管理,并且可能只需要进行单个内存分配就可以获得一点速度。因为构造后大小永远不会改变,所以可以使用此快捷方式而不必担心通过重新分配内存来使对它的引用无效。
稍微混淆一些事情list尽管是可变的,但也是PyVarObject
。但是,它有an item size of 0,因此实际上没有在对象的末尾分配额外的空间。相反,它存储指向单独分配的PyObject*
数组的指针(如果列表增长,则可以重新分配,而不会使对列表的引用无效)。据推测,只有PyVarObject
才有ob_size
字段。