Ich möchte eine c-Erweiterung mit einer Funktion schreiben, die ihr Argument ändert. Ist das möglich?Eine Python-C-Erweiterung schreiben, die das Argument ändert
HelloWorld.c
#include <Python.h>
// adapted from http://www.tutorialspoint.com/python/python_further_extensions.htm
/***************\
* Argument Test *
\***************/
// Documentation string
static char arg_test_docs[] =
"arg_test(integer i, double d, string s): i = i*i; d = i*d;\n";
// C Function
static PyObject * arg_test(PyObject *self, PyObject *args){
int i;
double d;
char *s;
if (!PyArg_ParseTuple(args, "ids", &i, &d, &s)){
return NULL;
}
i = i * i;
d = d * d;
Py_RETURN_NONE;
}
// Method Mapping Table
static PyMethodDef arg_test_funcs[] = {
{"func", (PyCFunction)arg_test, METH_NOARGS , NULL },
{"func", (PyCFunction)arg_test, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL}
};
void inithelloworld(void)
{
Py_InitModule3("helloworld", arg_test_funcs,
"Extension module example3!");
}
setup.py
from distutils.core import setup, Extension
setup(name='helloworld', version='1.0', \
ext_modules=[Extension('helloworld', ['helloworld.c'])])
Installation:
python setup.py install
Test:
import helloworld
i = 2; d = 4.0; s='asdf'
print("before: %s, %s, %s" % (i,d,s))
helloworld.func(i,d,s)
print("after: %s, %s, %s" % (i,d,s))
Testergebnis:
before: 2, 4.0, asdf
after: 2, 4.0, asdf
Die Integer- und Doppelwerte werden nicht geändert. Das Ergebnis sollte "nach: 4, 16.0, asdf"
Vielen Dank für die Hilfe.
'int's und' float's sind unveränderlich in Python. Also nein, sie können nicht geändert werden, Punkt. – Kundor
Ich suchte online und fand das ganz richtig. Ist es möglich, einen Zeiger auf die int/flow-Variable in die Funktion zu übergeben? Auf diese Weise kann die Funktion den Wert erhalten und ändern, auf den der Zeiger zeigt? Oder kann das (stackoverflow.com/questions/8056130/immutable-vs-mutable-types) funktionieren? – rxu
Nein. Der Wert kann nicht geändert werden. In Python gibt es ein einzelnes int-Objekt mit dem Wert 3. Wenn Sie eine Operation ausführen, die zu 3 führt, wird dieses Objekt zurückgegeben. Wenn Sie es irgendwie geschafft haben, auf den Speicherort zuzugreifen und seinen Inhalt auf, sagen wir, 4 zu ändern, dann wäre 1 + 2 überall 4. Das wäre schlecht. – Kundor