Изменить базовые (неизменяемые) типы внутри функции в Python? - PullRequest
0 голосов
/ 24 февраля 2009

Я использую C ++ SDK, где есть такая функция (у нее есть оболочка Python, но не документы):

getPos ( int uvId, float & u, float & v ) const 

Как мне указать в Python, чтобы переданные переменные были изменены?

Я попробовал этот пример, чтобы посмотреть, смогу ли я изменить плавающие внутри функции, но это не сработало, поэтому напечатал 12.0:

def change ( a ) :

    a = 35.0


b = 12.0

change ( b )

print b

Так как мне вызвать эту функцию, чтобы я мог изменить 2 внешних числа с плавающей точкой в ​​Python?

Связанный:

Ответы [ 4 ]

5 голосов
/ 24 февраля 2009

В Python:

def getPos(uvID):
    # compute u, v
    return u, v

# 
u, v = getPos(uvID)
2 голосов
/ 24 февраля 2009

Вам придется прибегнуть к ctypes .

В частности, см. https://docs.python.org/library/ctypes.html#passing-pointers-or-passing-parameters-by-reference

2 голосов
/ 24 февраля 2009

Насколько я знаю, Python не поддерживает вызов по ссылке, поэтому предлагаемый вами код не работает (очевидно).

Инструмент (или человек), который сгенерировал оболочку Python для функции C ++, должен был сделать что-то особенное для поддержки этой функции (надеюсь, или вы не сможете ее использовать). Знаете ли вы, какой инструмент использовался для создания оболочки?

Обычно такие инструменты генерируют какой-то тип данных контейнера:

b.value = 12.0
change(b)
print b.value
0 голосов
/ 24 февраля 2009

В простых случаях функция возвращает новое значение.

В более сложных случаях вы можете передать объект или список и изменить его:

def foobar(alist):
    alist[0] = 10

blist = [42]
foobar(blist)
print blist[0]

Edit:

Для упаковки ссылок на C ++ не существует никакого стандартного способа (базовые интерфейсы Python находятся на уровне C - не C ++) - поэтому это зависит от того, как реализован интерфейс Python - это могут быть массивы или возвращение нескольких значений. Я не уверен, как boost.python справляется с этим, но вы можете начать с него или, возможно, заглянуть в отладчик, чтобы увидеть, как обрабатывается параметр.

...