重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

python函数传指针 python传值

python中,能对函数传递文件指针类型的参数吗

如果你用C给Matlab写过MEX程序,那么这个问题是很容易理解的(好像每次讨论Python问题时我总是把Matlab搬了出来…… 《在Matlab中把struct当成Python中的Dictionary使用》《Matlab和Python的几种数据类型的比较》)。

创新互联-专业网站定制、快速模板网站建设、高性价比丛台网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式丛台网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖丛台地区。费用合理售后完善,10年实体公司更值得信赖。

既然提到了MEX,就简单说一下:

一个Matlab可能形如

function ret=add3(a,b,c)

如果在C的层面实现这个函数,就会看到另一种景象:

void mexFunction(int nlhs,mxArray * plhs[],int nrhs,const mxArray * prhs[])

a,b,c三个参数的地址放在一个指针数组里,然后把这个指针数组的首地址作为参数prhs传递给函数,这说明Matlab函数的参数是传递指针的,而不是值传递。

纵然是传递的指针,但是却不能在函数里改变实参的值,因为标记为“const”了。

Python是开放源码的,我没有看。所以下面很多东西是猜的。

Python在函数的参数传递时用的什么手法?实验一下(使用ActivePython2.5):

首先介绍一个重要的函数:

help(id)

Help on built-in function id in module __builtin__:

id(...)

id(object) - integer

Return the identity of an object. This is guaranteed to be unique among

simultaneously existing objects. (Hint: it's the object's memory address.)

看最后括号里那句:Hint:it's the object's address.(它是对象的地址)

有了这个函数,下面的事情就方便多了。

a=0

id(a)

3630228

a=1

id(a)

3630216

可以看出,给a赋一次值,a的address就改变了。在C的层面看,(也许真实情况不是下面的样子,但作为一个类比应该还是可以的):

void * pa;

pa=malloc(sizeof(int));

*(int *)pa=0;

free(pa);

pa=malloc(sizeof(int));

*(int *)pa=1;

Python中每次赋值会改变变量的address,分配新的内存空间,所以Python中对于类型不像C那样严格要求。

下面看看Python函数参数传递时到底传的什么:

有一个函数:

def changeA(a):

... print id(a)

... a=100

... print id(a)

设定一个变量var1:

var1=10

id(var1)

3630108

changeA(var1)

3630108

3631012

var1

10

调用函数后,从两次print的结果可以看出,传递确实是地址。但是即便如此,在函数内对形参的修改不会对实参造成任何实质的影响,因为对形参的重新赋值,只是改变了形参所指向的内存单元(changeA里两次调用print id(a)得到不同的结果),却没有改变实参的指向。在C的层面看也许类似下面的情节:

void changeA(void * pa)

{

pa=malloc(sizeof(int));

*(int *)pa=100;

free(pa);

}

精通C的你一眼就看出这个函数永远也改变不了它外面的世界。

也就是说虽然传递的是地址,但像changeA这样的函数改变不了实参的值。

也许会感到困扰?不,我已经在Matlab中习惯了。

一个最典型的例子就是Matlab中删除结构体成员的rmfield函数(参见《Matlab笔记三则》),

(Matlab版本7.0.1)

如果想删除结构体patient的name成员,用

rmfield(patient, 'name');

是永远达不到目的的(就像试图用双手抓住自己的领子,把自己提到空中);

迷途知返的做法是:

patient = rmfield(patient, 'name');

python调用dll怎么传入一个指针接收结果?

dk 可能是调用Create_Data前开辟的一个空间,dkLen传入该空间大小,以方便函数Create_Data写入结果到指针指向的空间。

python如何传递给c++一个结构体指针?前提是swig封

在封装的代码间传递指针你要确保他们运行在相同的地址空间里,还要保证指针指向的内存的生存期是安全的,否则这种思路就是错误的。实现方法举例如下:

1、定义了C 结构体和函数如下

typedef struct NameAge

{

char name[20];

int age;

}NameAge , *NameAgePointer;

void test(NameAgePointer p) // 接收结构体指针

{

// do something with p...

}

2、python定义结构体如下

#python中结构体定义

class PyStruct():

def __init__(self, name, age):

self.name = name

self.age = age

fred = PyStruct("fred", 5)

3、假设把第1步里的test封装成example模块,python导入example(既然你都会swig了,这个过程就不啰嗦了)

import example

example.test(pointer(fred))

以上是基本思路,因为搭建开发环境和过程比较繁杂,没有验证过,但是应该没有大问题


当前题目:python函数传指针 python传值
文章URL:http://cqcxhl.cn/article/dosijes.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP