5

我已经找到了关于如何将长长的参数列表传递给函数的各种详细解释,但我仍然有点怀疑这是否是正确的方法。

换句话说,我怀疑我做错了,但我看不出如何做

问题:我有(不是很长)循环函数,它使用了相当多的变量,并且至少需要修改其中的一些内容。

我最终得到的是这样的:

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

...我想看看我对原始变量所做的更改(在 CI 中只会传递一个引用,但我听说在 Python 中它总是一个副本?)。

对不起,如果菜鸟,我不知道如何表达这个问题,所以我可以找到相关的答案。

4

7 回答 7

11

您可以将所有参数包装在一个类中,如下所示:

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 实例是通过引用传递的,所以保留了函数中的更改。

于 2013-06-21T11:39:42.007 回答
7

这通常用于matplotlib,例如。*他们使用or传递一长串参数**,例如:

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

调用函数:

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

Here 1,2,3,4,5will goargsa=1, b=2, c=3will go to kwargs,作为字典。这样他们就可以达到您的功能,例如:

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

你可以用你想要的方式对待他们。

于 2013-06-21T11:42:27.893 回答
3

我不知道您从哪里得到 Python 在传递给函数时复制值的想法。这根本不是真的。

相反:函数中的每个参数都是引用原始对象的附加名称。如果您以某种方式更改该对象的值- 例如,如果它是一个列表并且您更改了其中一个成员 - 那么原始对象也会看到该更改。但是,如果您将名称重新绑定到其他内容(例如通过做alpha = my_completely_new_value),则原始名称保持不变。

于 2013-06-21T11:40:01.053 回答
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()
于 2013-06-21T11:48:42.393 回答
1

您可以在闭包中捕获未修改的值:

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 中编写真正递归函数的唯一方法。)

于 2013-06-21T11:55:20.587 回答
0

你可以传入一个字典并返回一个新字典。或者将您的方法放在一个类中,并让 alpha、beta 等成为属性。

于 2013-06-21T11:31:45.533 回答
0

你应该myFunction上课。使用适当的属性设置类并调用适当的函数。然后状态很好地包含在类中。

于 2013-06-21T11:36:17.377 回答