python指针函数 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指针函数 python 函数指针】关于python指针函数和python 函数指针的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

推荐阅读