我需要有一个 python 对象数组用于创建 trie 数据结构。我需要一个像元组一样长度固定、像列表一样可变的结构。我不想使用列表,因为我希望能够确保该列表是exactly正确的大小(如果它开始分配额外的元素,随着 trie 变大,内存开销可能会很快增加)。有没有办法做到这一点?我尝试创建一个对象数组:
cdef class TrieNode:
cdef object members[32]
...但这给出了一个错误:
Error compiling Cython file:
------------------------------------------------------------
...
cdef class TrieNode:
cdef object members[32]
^
------------------------------------------------------------
/Users/jason/src/pysistence/source/pysistence/trie.pyx:2:23: Array element cannot be a Python object
做我想做的事情的最佳方法是什么?
我不知道best解决方案,但这里是a解决方案:
from cpython.ref cimport PyObject, Py_XINCREF, Py_XDECREF
DEF SIZE = 32
cdef class TrieNode:
cdef PyObject *members[SIZE]
def __cinit__(self):
cdef object temp_object
for i in range(SIZE):
temp_object = int(i)
# increment its refcount so it's not gc'd.
# We hold a reference to the object and are responsible for
# decref-ing it in __dealloc__.
Py_XINCREF(<PyObject*>temp_object)
self.members[i] = <PyObject*>temp_object
def __init__(self):
# just to show that it works...
for i in range(SIZE):
print <object>self.members[i]
def __dealloc__(self):
# make sure we decref the members elements.
for i in range(SIZE):
Py_XDECREF(self.members[i])
self.members[i] = NULL
赛通object
是自动重新计数的PyObject *
。您始终可以滚动自己的数组PyObject *
只要你负起重新计票这些小混蛋的责任。对于重要的案例来说,这可能是一个令人头疼的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)