2014-02-12 98 views
12

我是Cython和C++的noob,所以我有一个关于参数传递的问题。我想避免传递参数的副本在以下情形: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)

+0

关于[cython-users](https://groups.google.com/forum/#!forum/cython-users)上的某些相关问题:[“关于传递引用的问题”]( https://groups.google.com/forum/#!topic/cython-users/6c2ixr4xEZA) – iljau

回答

14

找到了我自己问题的答案。显然,你可以通过参考,但功能必须是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)