проход по значениям Cython - PullRequest
       133

проход по значениям Cython

0 голосов
/ 02 января 2019

Я встретил интересный случай, касающийся передачи по значению Cython.Код записан в блокноте jupyter:

%%cython -a
#cython: language_level = 3
#distutils: language = c++
from libcpp.map cimport map
from libcpp.string cimport string
cdef fun( map[ string, double ] a ):
    a[ b'H' ] = 10

cdef map[ string, double ] a
a[ b'H' ] = 0
fun( a )
print( a[ b'H' ] )

Возвращаемое значение равно 0

Если мы напишем его на python:

def fun( a ):
   a[ 'a' ] = 10
a = { 'a' : 5 }
fun( a )
print( a[ 'a' ] )

Ответ будет 10

Могут ли некоторые эксперты объяснить, почему cython и python показывают разное поведение?

1 Ответ

0 голосов
/ 02 января 2019

Если вы хотите передать по ссылке в C ++ или C ++ - объекты в Cython, вы должны передать его по ссылке, то есть сигнатура функции fun должна быть

cdef fun( map[ string, double ] &a ):
     ...

Все объекты Pythonявляются указателями типа PyObject *, а сигнатура

def fun(object a):
   ...

приблизительно переводится в

PyObject *fun(PyObject *a){
      ...
}

, то есть аргументы передаются как указатели, что соответствует ссылкам C ++ в чистом C.

...