2013-06-21 36 views
1

我已經找到了關於如何將長參數列表傳遞給一個函數的各種詳細解釋,但是我仍然懷疑這是否是正確的方法。Python:處理具有長參數列表的函數的最佳方法?

換句話說,我懷疑,我做錯了,但我看不出怎麼辦呢

問題:我有(不是很長)的復發函數,它使用了很多變量,需要修改其中至少一些內容。

我最終得到的是某事像這樣:

def myFunction(alpha, beta, gamma, zeta, alphaList, betaList, gammaList, zetaList): 
    <some operations> 
    myFunction(alpha, beta, modGamma, zeta, modAlphaList, betaList, gammaList, modZetaList) 

...我希望看到我做了對原始變量(在CI只想傳遞一個參考的變化,但我聽說,在Python它總是一個副本?)。

對不起,如果noob,我不知道如何說這個問題,所以我可以找到相關的答案。

+1

你能舉一個具體的例子嗎? –

+0

在python中它是_never_副本 –

+0

這個答案將幫助你理解參數如何表現參考 - > http://stackoverflow.com/a/986145/15931 –

回答

0

你應該把myFunction放在課堂上。使用適當的屬性設置類並調用相應的函數。這個國家在課堂上是很好的。

0

您可以傳入字典並返回一個新字典。或者把你的方法放在一個類中,並具有alpha,beta等屬性。

2

你可以包所有參數的一類,像這樣:

class FooParameters: 
    alpha = 1.0 
    beta = 1.0 
    gamma = 1.0 
    zeta = 1.0 
    alphaList = [] 
    betaList = [] 
    gammaList = [] 
    zetaList = [] 

,然後你的函數只有一個參數,比如:

def myFunction(params): 
    omega = params.alpha * params.beta + exp(params.gamma) 
    # more magic... 

調用諸如:

testParams = FooParameters() 
testParams.gamma = 2.3 
myFunction(testParams) 
print params.zetaList 

因爲params實例通過參考,功能的變化被保留。

1

我不知道你在哪裏得到Python傳遞函數時複製值的想法。那是根本不是是真的。

相反:函數中的每個參數都是引用原始對象的附加名稱。如果您以某種方式更改該對象的值 - 例如,如果它是一個列表並且您更改了其成員之一 - 那麼原件也會看到該更改。但如果你重新綁定這個名字到別的東西 - 說做alpha = my_completely_new_value - 然後原來保持不變。例如,

+0

雖然在技術上是正確的說*「每個參數在一個函數是引用原始對象「*」的附加名稱,不可變類型的行爲不是某個人希望用於通過引用傳遞的變量(如C中所示)。如果在函數內改變了一個'int'參數(例如,通過執行'alpha + = 1'),原始變量不會受到影響。 –

+0

從技術上講,python(就像任何其他主要的編程語言,至少默認)使用「傳值」語義。這是他從中獲得創意的地方。是的,這很混亂。 – Elazar

2

這通常在matplotlib中使用。

def function(*args, **kwargs): 
    do something 

調用函數:

function(1,2,3,4,5, a=1, b=2, b=3) 

這裏1,2,3,4,5會去argsa=1, b=2, c=3會去kwargs,作爲字典使用它們或***,像傳遞的參數長長的名單。所以他們到達你的功能就像:

args = [1,2,3,4,5] 
kwargs = {a:1, b:2, c:3} 

而且你可以以你想要的方式對待它們。

1

你可能受到誘惑,這個東西類似:

def myFunction(*args): 
    var_names = ['alpha','beta','gamma','zeta'] 
    locals().update(zip(var_names,args)) 
    myFunction(alpha,beta,gamma,zeta) 

然而,這個「常」是行不通的。我建議引入另一個命名空間:

from collections import OrderedDict 
def myFunction(*args): 
    var_names = ['alpha','beta','gamma','zeta'] 
    vars = OrderedDict(zip(var_names,args)) 

    #get them all via vars[var_name] 

    myFunction(*vars.values()) #since we used an orderedDict we can simply do *.values() 
1

你可以在一個封閉捕捉非modfied值:

def myFunction(alpha, beta, gamma, zeta, alphaList, betaList, gammaList, zetaList): 
    def myInner(g=gamma, al, zl): 
     <some operations> 
     myInner(modGamma, modAlphaList, modZetaList) 
    myInner(al=alphaList, zl=zetaList) 

(順便說一句,這是即將用Python語言編寫一個真正的遞歸函數的唯一途徑。 )

相關問題