2013-06-21 57 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语言编写一个真正的递归函数的唯一途径。 )

相关问题