0

我想检查内存视图是否用无初始化。我有这样的功能:

cdef void test(int[:] a):
    if a == NULL:
        print("invalid data")

cdef int[:] memview = None
test(memview)

编译时出现此错误:

Invalid types for '==' (int[:], void *)

将 None 分配给内存视图是否存在问题?如果不是这种情况,我该怎么做才能检测到 NULL 值?

谢谢!

4

1 回答 1

1

将我的评论变成一个非常好的答案:

您正在分配None给您的内存视图:

cdef int[:] memview = None

因此,检查它是有意义的None,而不是检查NULL

if a is None:

最终它们是相似的概念,但不同的东西:NULL是一个不指向任何东西的指针,而是None一个单例 Python 对象,它指示某些东西是未设置的。区别实际上是 C 级别和 Python 级别之间的区别,这里的内存视图充当“Python 级别”。


还有一个额外的细节可以让你if a is None在一个nogil块中做:Python 确保存在一个None对象(并且它None在整个程序中仍然是同一个对象)。因此可以翻译a is None成C代码

((PyObject *) __pyx_v_a.memview) == Py_None

即一个简单的指针比较,不需要 GIL,因为引用计数没有变化。

于 2020-07-30T07:06:17.633 回答