Skip to main content
 首页 » 编程设计

python之在函数外部用 cdef 声明的变量在函数内部是否具有相同的类型

2025年05月04日7kenshinobiy

我在同一个模块的所有函数中使用了很多相同类型的变量:

def func1(double x): 
    cdef double a,b,c 
    a = x 
    b = x**2 
    c = x**3 
    return a+b+c 
 
def func2(double x): 
    cdef double a,b,c 
    a = x+1 
    b = (x+1)**2 
    c = (x+1)**3 
    return a+b+c 

我的问题是,如果我像下面那样做,会不会一样?将变量声明放在函数之外? (实际情况不同,功能不止2个)

cdef double a,b,c 
 
def func1(double x): 
    a = x+2 
    b = (x+2)**2 
    c = (x+2)**3 
    return a+b+c 
 
def func2(double x): 
    a = x+2 
    b = (x+2)**2 
    c = (x+2)**3 
    return a+b+c 

请您参考如下方法:

原则上cython处理全局变量和python一样,不管是C类型还是Python类型。看看this part of the FAQ .

所以您的(第二个)示例将不起作用,您必须在函数的开头使用 global variable,如下所示:

def func2(double x): 
    global a, b, c 
    a = x + 2 
    b = (x + 2) ** 2 
    c = (x + 2) ** 3 
    return a + b + c 

但是,在这一点上我想质疑,你是否真的需要这样做。总的来说,有很好的论据,为什么global variables are bad .所以你真的可能想重新考虑。

我假设您的三个 double 只是一个玩具示例,所以我不确定您的实际用例是什么。从你的(第一个)例子来看,重用代码可以通过另一个参数扩展函数来完成,就像这样:

def func(double x, double y=0): 
    cdef double a, b, c 
    a = x + y 
    b = (x + y) ** 2 
    c = (x + y) ** 3 
    return a + b + c 

这至少可以通过使用 y = 0 和 y = 1 覆盖您的示例 func1 和 func2 > 分别。