让一个函数设置一个全局变量

Having a function set a global variable

考虑以下 C++ 模块(后面有解释):

#include <Python.h>
#include "nr3python.h"

Doub tau_0;

static PyObject* analysis_c_set_parameters(PyObject *self, PyObject *pyargs) {
  NRpyArgs args(pyargs);
  Doub tau_0 = NRpyDoub(args[0]);
  return NRpyObject();
}

Doub solver(const Doub t) {
  return tau_0;
}

static PyObject* analysis_c_solver(PyObject *self, PyObject *pyargs) {
  NRpyArgs args(pyargs);
  const Doub t = NRpyDoub(args[0]);
  const Doub result = solver(t);
  return NRpyObject(result);
}

static PyMethodDef AnalysisCMethods[] = {
  {"set_parameters", analysis_c_set_parameters, METH_VARARGS,
   "Set fixed parameters for the optimization procedure."},
  {"solver", analysis_c_solver, METH_VARARGS,
   "Call the optimization function for solving for the spike time."},
  {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initanalysis_c(void)
{
  (void) Py_InitModule("analysis_c", AnalysisCMethods);
}

请注意,此模块已设置为可以将其功能导入 Python 脚本。

我有一个全局变量tau_0,声明时没有初始值。当调用函数 analysis_c_set_parameters 时(在 Python 内)设置(或应该设置)该值。然后在调用 analysis_c_solver 时读出此值:analysis_c_solver 调用 solver,returns tau_0analysis_c_solver 然后 returns tau_0.

我面临的问题是,当我在 Python 脚本中调用这些函数时,我得到 0.0 作为 tau_0 的值,即使我已经尝试设置它到别的东西(例如,0.5)。

在Python我有

import analysis_c


TAU_0 = 0.5
t = 0

analysis_c.set_parameters(TAU_0)
actual_result = analysis_c.solver(t)

在这种情况下,actual_result 设置为 0.0

这是怎么回事?

您似乎在定义一个隐藏全局变量的局部变量:

Doub tau_0;

static PyObject* analysis_c_set_parameters(PyObject *self, PyObject *pyargs) {
  NRpyArgs args(pyargs);
  Doub tau_0 = NRpyDoub(args[0]);  // here you are defining a local tau_0
  return NRpyObject();
}

这一行声明并初始化了一个新的局部变量:

Doub tau_0 = NRpyDoub(args[0]);

要分配给您已经声明的全局变量,您需要编写

tau_0 = NRpyDoub(args[0]);