Подтвердить что ты не робот

Cython & С++: передача по ссылке

Я ноб с Cython и С++, поэтому у меня вопрос о передаче аргументов. Я хочу избежать передачи копии аргумента в следующем сценарии:

# 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 "на месте." Я верю в С++, вы можете достичь этого, предварительно дождав аргумент с помощью &, что означает, что любые изменения указателя передаются указателю. Таким образом, вам не нужно беспокоиться о передаче указателя или фактического объекта, т.е.

add_one(v); # in c++

Могу ли я сделать то же самое в Cython, или мне нужно явно изменить тип arg вместо ссылки, т.е. def add_one(vector[int]* vect)?

4b9b3361

Ответ 1

Нашел ответ на мой собственный вопрос. По-видимому, вы можете проходить по ссылке, но функция ДОЛЖНА быть 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)