为什么Cython强制在函数开头声明本地人

时间:2014-02-05 09:03:51

标签: scope local cython

这是Cython - copy constructors中的评论。

以下代码无法在Cython中编译:

def bar(int i):
    if i == 0:
        return i
    else:
        cdef int j
        j = i+1
        return j

而这一个是完全正确的:

def foo(int i):
    cdef int j
    if i == 0:
        return i
    else:
        j = i+1
        return j

问题是:为什么Cython强制在...开始时声明j 功能而不是else块?

1 个答案:

答案 0 :(得分:2)

原因是Python与C / C ++中的范围规则。

Cython正试图让Python和C / C ++世界变得更好。但这两个世界之间存在一些不相容之处。范围规则是一个。

  • 在C / C ++中,局部变量的范围从声明它的位置到声明它的最内部块的结尾。
  • 在Python中,如果变量在函数中的某处分配,则该变量在函数中被视为本地变量。然后它可以在函数内的任何地方使用。

为了修补这两个规则,Cython开发人员决定只允许在函数开头使用局部变量声明。