2012-01-07 54 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