Есть ли способ сделать разыменование перед присваиванием в Cython, например, для выполнения присваивания значений в списке C ++ на месте?
Документация Cython ( здесь ) говорит, что выследует использовать dereference(foo)
для создания кода C ++, например *(foo)
, но этот синтаксис нельзя использовать для назначения (например, *(foo) = *(foo) + 1
.
. Ниже приведен пример назначения (в функции inplace_normalize
), которыйЯ не мог реализовать с помощью функции разыменования Cython.
from libcpp.list cimport list as cpplist
from cython.operator import dereference as deref, preincrement as inc
cpdef cpplist[double] normalize(cpplist[double] l):
cdef double norm
cdef cpplist[double] l2
for v in l:
norm += v
for v in l:
l2.push_back(v/norm)
return l2
# inplace version of normalize
cpdef void inplace_normalize(cpplist[double] l):
cdef double norm
for v in l:
norm += v
cdef cpplist[double].iterator it = l.begin()
while it != l.end():
# deref(it) = deref(it)/norm #== *it = *it / norm
print(deref(it)/norm)
inc(it)
Если я пытаюсь использовать deref(it) = deref(it)/norm
, я получаю ошибку Cannot assign to or delete this
. Каково решение для присвоения значений на месте в libcpp.list используя Cython?