2014-02-12 95 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)