2012-01-07 52 views
1

可能重复:
Python: How do I pass a variable by reference?参数传递的行为在Python函数在Python

我要测试的参数通过以下2个功能传递的行为在Python功能:

In:

def f(a): 
     a[0]=3 
     print 'in f ',a 
a=[1,2] 
print 'ori ',a 
f(a) 
print 'now ',a 

事实证明,“a”在从f()返回后已被修改。

然而,在:

import numpy as np 
def f(a): 
     a=np.array(a,np.float) 
     print 'in f ',a 
a=[1,2] 
print 'ori ',a 
f(a) 
print 'now ',a 

我发现, “一” 不选自F返回后改变为numpy的阵列()。

有人可以给一些解释吗?

+5

我敢肯定,十几个副本中的一个可以。 – 2012-01-07 04:43:16

+0

哦,你修改了代码。即使现在'a'也不会被转换,因为您在函数中将名称'a'赋值为一个numpy数组(覆盖旧名称并丢失引用)并且您没有返回它 – joaquin 2012-01-07 04:55:36

+0

简而言之,Python使用[由共享调用] (https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing)。 – icktoofay 2012-01-07 04:58:42

回答

4

我看到这很多,所以它一定已经回答了,但这是我的要求。

的两行:

a[0]=3 

a=np.array(a,np.float) 

做点什么完全不同。第一个不会改变什么a是 - 它仍然是这行后面的列表。它巧妙地在列表的索引0处设置一个新对象。我们说它变异了吧。

第二行将一个新对象绑定到函数的本地a变量。从那时起,a里面的函数引用了一个不同的对象。功能外的a是完全独立的,所以它仍然指向列表。 a只是简单地引用了同一个对象。

您不能像这样重新绑定函数以外的名称。有多种方法可以避免这种情况,其中之一是返回新对象,并让调用者将返回值绑定回它自己的a