我正在尝试理解Python的变量范围方法.在这个例子中,为什么f()能够改变x内部感知main()的价值,而不是价值n?
def f(n, x):
n = 2
x.append(4)
print('In f():', n, x)
def main():
n = 1
x = [0,1,2,3]
print('Before:', n, x)
f(n, x)
print('After: ', n, x)
main()
Run Code Online (Sandbox Code Playgroud)
输出:
Before: 1 [0, 1, 2, 3]
In f(): 2 [0, 1, 2, 3, 4]
After: 1 [0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的C接口(简化):
extern bool Operation(void ** ppData);
extern float GetFieldValue(void* pData);
extern void Cleanup(p);
Run Code Online (Sandbox Code Playgroud)
使用如下:
void * p = NULL;
float theAnswer = 0.0f;
if (Operation(&p))
{
theAnswer = GetFieldValue(p);
Cleanup(p);
}
Run Code Online (Sandbox Code Playgroud)
您将注意到Operation()分配缓冲区p,GetFieldValue查询p,以及Cleanup释放p.我对C接口没有任何控制权 - 该代码在其他地方被广泛使用.
我想通过SWIG从Python调用这段代码,但是我无法找到如何将指针传递给指针的任何好例子 - 并检索它的值.
我认为正确的方法是使用类型映射,所以我定义了一个接口,它会在C端为我自动取消引用p:
%typemap(in) void** {
$1 = (void**)&($input);
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法使用以下python代码:
import test
p = None
theAnswer = 0.0f
if test.Operation(p):
theAnswer = test.GetFieldValue(p)
test.Cleanup(p)
Run Code Online (Sandbox Code Playgroud)
在调用test.Operation()之后,p始终保持其初始值None.
任何帮助找出在SWIG中执行此操作的正确方法将非常感激.否则,我可能只是围绕C代码编写一个C++包装器,阻止Python处理指针.然后使用SWIG 包装该包装器.有人阻止我!
编辑:
感谢Jorenko,我现在拥有以下SWIG界面:
% module Test
%typemap (in,numinputs=0) void** (void *temp)
{ …Run Code Online (Sandbox Code Playgroud)