Cython编译错误assignmen之前引用的局部变量

2024-09-30 01:34:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来的Cython和尝试加速我的kivy移动游戏使用Cython代码在关键的人工智能模块。我的代码如下:

import numpy as np
cimport numpy as np

 #not relevant parts

cdef np.ndarray posarr
cdef np.int poslast = 0
cdef np.int posidx = 0

def posarr_init(np.ndarray pawnpos, np.int act):
    poslast = 0
    # not relevant, but referencing poslast

 #not relevant, but including function where poslast is referenced (not assigned)

def consider_pawn(np.int x, np.int y):
    cdef np.int pact, posx, posy, resx, resy
    cdef np.int p
    cdef np.int found = 0
    #not relevant

    #in the code there is this line, posx and posy are local variables
                    posarr[poslast, posx, posy] = posarr[posidx, posx, posy]

在这里,Cython给出了编译过程中的错误:

^{pr2}$

我可以看到Cython编译错误的报告顺序与它们在代码中出现的顺序相同。我的问题是:

为什么Cython认为poslast是局部变量?在

为什么在以前的函数中它不把它当作局部变量呢?在

生成的C文件是空的,它只有一条不应该在内部使用的消息。有没有一种方法可以强迫Cython在文件中保留C代码,即使有编译错误?也许查看这个文件可以帮助我理解错误信息(例如,为什么这个变量被认为是本地的)。。。在


Tags: 文件代码numpyas错误npnotcython
1条回答
网友
1楼 · 发布于 2024-09-30 01:34:03

简短回答

使用global语句在每个写入poslast的函数中显式地声明{}为全局。在

长答案

Cython遵循Python绑定规则:如果在函数中的任何地方分配了一个名称,则假定它是一个局部变量,除非您显式地将其声明为全局变量。在

我想您应该在示例循环之后执行并赋值给poslast,这使得它成为隐式声明的局部变量(类型为object)。然后循环似乎使用了这个尚未初始化的本地。在

您的posarr_init函数也同样不正确。它将隐式声明的local poslast赋值,而不接触全局。在

相关问题 更多 >

    热门问题