函数引用python 函数引用公式无效,怎么处理

Python 函数中,参数是传值,还是传引用

这个问题的答案无外乎这几种说法:传值,传引用,对于可变对象是传引用,不可变对象是传值。

鄂城网站建设公司创新互联建站,鄂城网站设计制作,有大型网站制作公司丰富经验。已为鄂城1000+提供企业网站建设服务。企业网站搭建\外贸营销网站建设要多少钱,请找那个售后服务好的鄂城做网站的公司定做!

传引用

先看下面这个例子:

def foo(n):

... print id(n)

... n = 3

... print id(n)

n = 2

id(n)

31030000L

foo(n)

31030000L

31029976L

n

2

id(n)

31030000L

由foo中两次输出不相等可以看出,传引用说法并不成立。

传值

来看下面的例子:

def foo(n):

... print n

... n.append(3)

... print n

n = [1, 2, 4, 8]

foo(n)

[1, 2, 4, 8]

[1, 2, 4, 8, 3]

n

[1, 2, 4, 8, 3]

按传值的说法,一个值传进来,在函数内改动并不会影响变量本身的值,上面例子中n变量本身的值也被改变了,说明传值的说法也不对。

3.可变对象传引用,不可变对象传值

相比上面两种说法,这种说法似乎更靠谱,传播也更为广泛,那它到底对不对呢?

def foo(n):

... print id(n)

... n = ['1', '2', '3']

... print id(n)

... print n

n = [1,2,3,4,5,6]

id(n)

35637576

foo(n)

35637576

35916168

['1', '2', '3']

n

[1, 2, 3, 4, 5, 6]

按照可变对象传引用的说法,上面list类型是可变对象,应该传引用,这foo方法中两次调用id应该输出一样的值,更改的结果也应该影响到外部变量,但结果显然不是这样的,这说明,这种说法也是不正确的。

那么Python传值的方法到底是什么样呢?其实Python中的函数参数所遵循的是传对象(call by object),或者叫做穿对象的引用(call by object reference)。在调用函数时,将变量整个对象传入,对于可变对象的修改,在函数内外均可见;而对于不可变对象,因为其并不能真正意义上被赋值,修改是通过生成新的对象来实现的。

下面来一个有趣的例子作为结尾:

def bar(a = []):

... print id(a)

... a.append(7)

... print a

for _ in range(5):

... bar()

#结果输出请自己动手实践,原因应该不难理解

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

如果你用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');

Python中 自己定义的函数内生成的列表 怎么在外部中引用?

下面的例子演示了用3种方法来在外部引用函数内部定义的列表:

#返回函数内部定义的列表

def int_list1():

l=[1,2]

return l

#将函数内部列表定义成全局的

def int_list2():

global l

l=[3,4]

#将函数内部列表定义成函数的一个属性

def int_list3():

l=[5,6]

int_list3.l=l

print(int_list1())

int_list2()

print(l)

int_list3()

print(int_list3.l)

这是截图:

python函数调用

inname = r"C:\Python27\esri.shp"

outname = "outname.cst"

# 在此处调用该函数。函数体定义必须放在调用以前。可以通过import

read_ESRT_……(file = inname, fileOut = outname)

# 这两个参数只是字符串而已,指明你的文件路径。注意在python中,若有 \ 号,则最好使用 \\ 双斜杠,或者如上例,加上前缀 r

python 如何引用第一个函数的结果

你写的函数里面只是打印出功能,这个在语法方面没什么问题,但是达不到你的要求,如果想引用一个函数的结果,必须给它加一个return值,这样就能获取返回的结果

def test(n):

return n

a = test(2)

print a

Python中函数调用是传值还是传引用

python中所有数据都是对象,所以传参也是传的对象的引用,这个引用在函数执行前和执行后是不会被改变的,如:

num

=

1

def

change(num):

print(id(num))

num

=

2

print(id(num))

执行change(num)后num的值还是1

可以看到在执行前num的id值(可以理解为内存地址)是某一值

但在执行change后,num的id值改变了,也就是说内部的num指向了另外的对象,而外部的num却还是指向原来的对象,所以值没有变;

同理,如:

num_list

=

[1,2]

def

change_list(num_list):

print(id(num_list))

num_list.append(3)

print(id(num_list))

可以看到执行change_list后num_list的id值没有改变,也就是说num_list是在原来的对象上添加了新的数据,外部的num_list也是指向这一对象,所以外部的num_list数据也添加了新的数据。


分享文章:函数引用python 函数引用公式无效,怎么处理
URL分享:http://scyanting.com/article/docijjs.html