我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

python有函数指针吗 python有无指针

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

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

创新互联建站主营金寨网站建设的网络公司,主营网站建设方案,app开发定制,金寨h5小程序设计搭建,金寨网站营销推广欢迎金寨等地区企业咨询

既然提到了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有没有指针

如果您曾经使用过C或C ++等低级语言,那么您可能已经听说过指针。指针允许您在部分代码中创建高效率。它们也会给初学者带来困惑,并且可能导致各种内存管理错误,即使对于专家也是如此。那么在Python中有指针的存在吗?

指针广泛用于C和C ++。本质上,它们是保存另一个变量的内存地址的变量。有关指针的更新,可以考虑在C指针上查看此概述。

为什么Python没有指针?

实际上指针为何不存在的原因现在还不知道,也许指针违背了Python的禅宗。指针鼓励隐含的变化而不是明确的变化。但通常情况下,它们很复杂而不是很简单,特别是对于初学者。更糟糕的是,当他们用指针指向自己的方法,或做一些非常危险的事情,比如从你无法获取的的一些变量中读取数据。

Python更倾向于尝试从用户那里抽象出内存地址来实现具体细节,所以Python通常关注可用性而不是速度。因此,Python中的指针并没有多大意义。但是在有些情况下,Python会为您提供使用指针的一些好处。

想要理解Python中的指针,需要理解Python实现指针功能的具体细节。简单来说,需要了解这些知识点:

不可变对象和可变对象【Python中的对象】

Python变量/名称【Python中的变量】

【在Python中模拟实现指针】

python数据类型

CS是一个引用。

引用和指针的区别你应该很清楚吧,前者是内存的别名,后者是内存地址的存储变量。

CS是一个引用,返回C语言自然要用指针变量来接收而不是指针接受。

指针应该接受的是id(CS)。

*指针接受cs。

附:ID函数实际运行

cd

'abcdef'

id(cd)

35255712

python使用C函数返回的指针

int* GrabImage();

int GetPixel(int* image, int x, int y);

void SetPixel(int* image, int x, int y, int color);


网站栏目:python有函数指针吗 python有无指针
分享链接:http://shouzuofang.com/article/doegojs.html

其他资讯