这是在 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
block 中?
最佳答案
原因是 Python 与 C/C++ 中的作用域规则。
Cython 正在努力超越 Python 和 C/C++ 世界。但这两个世界之间存在一些不相容的地方。范围规则就是其中之一。
- 在 C/C++ 中,局部变量的作用域是从它的声明点到声明它的最内部 block 的末尾。
- 在 Python 中,如果变量被分配到函数中的某个位置,则该变量被视为函数中的局部变量。然后它就可以在函数内的任何地方使用。
为了修补这两条规则,Cython 开发人员决定仅允许在函数开头声明局部变量。
关于scope - 为什么 Cython 强制在函数开头声明局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21572718/