编程语言
首页 > 编程语言> > python – Cython&C:通过引用传递

python – Cython&C:通过引用传递

作者:互联网

我是Cython和C的菜鸟,所以我对论证传递有疑问.我想避免在以下场景中传递参数的副本:

# somefile.pyx
#distutils: language = c++
from libcpp.vector cimport vector

def add_one(vector[int] vect):
    cdef int i
    n = vect.size()
    for i in range(n):
        vect[i] += 1

cdef vector[int] v
for i in range(100000):
    v.push_back(i)
add_one(v) # <-- ??

我希望方法add_one只是修改v“就地”.我相信C,你可以通过使用&预先挂起参数来实现这一点,这意味着对指针的任何更改都会传递给指针.这样,您不必担心传递指针或实际对象,即

add_one(v); # in c++

我可以在Cython中做同样的事情,还是我必须明确地将arg类型更改为引用,即def add_one(vector [int] * vect)?

解决方法:

找到了我自己的问题的答案.显然,你可以通过引用传递,但函数必须是cdef’ed,而不是def’ed.即

# somefile.pyx
#distutils: language = c++
from libcpp.vector cimport vector

cdef void add_one(vector[int]& vect):
    cdef int i
    n = vect.size()
    for i in range(<int>n):
        vect[i] += 1

cdef vector[int] v
for i in range(100000):
    v.push_back(i)
add_one(v)

标签:python,c,reference,pass-by-reference,cython
来源: https://codeday.me/bug/20191006/1860460.html