Python里面的函数怎么按引用传递参数

 我来答
福喜900
推荐于2016-08-28 · TA获得超过6.1万个赞
知道大有可为答主
回答量:1.1万
采纳率:0%
帮助的人:1亿
展开全部
如果你用C给Matlab写过MEX程序,那么这个问题是很容易理解的(好像每次讨论Python问题时我总是把Matlab搬了出来…… 《在Matlab中把struct当成Python中的Dictionary使用》《Matlab和Python的几种数据类型的比较》)。
既然提到了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');
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式