5

引数の長いリストを関数に渡す方法について、さまざまな詳細な説明を見つけましたが、それが適切な方法であるかどうかはまだ疑問です。

言い換えれば、私はそれを間違っているのではないかと疑っていますが、それを正しく行う方法がわかりません。

問題: かなりの数の変数を使用し、少なくともそれらのいくつかのコンテンツを変更する必要がある (それほど長くはない) 再帰関数があります。

最終的には、次のような sth になります。

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)

ここで1,2,3,4,5は、辞書としてに移動しargs、に移動します。次のように関数に到達するようにします。a=1, b=2, c=3kwargs

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

そして、あなたはそれらをあなたが望む方法で扱うことができます。

于 2013-06-21T11:42:27.893 に答える
3

関数に渡すときにPythonが値をコピーするという考えをどこで得たのかわかりません。それはまったく真実ではありません。

反対に、関数内の各パラメーターは、元のオブジェクトを参照する追加の名前です。そのオブジェクトの値を何らかの方法で変更すると (たとえば、リストで、そのメンバーの 1 つを変更した場合)、元のオブジェクトにもその変更が反映されます。しかし、名前を別のものに再バインドalpha = my_completely_new_valueすると (たとえば、実行して)、元の名前は変更されません。

于 2013-06-21T11:40:01.053 に答える
0

辞書を渡して、新しい辞書を返すことができます。または、メソッドをクラスに入れ、アルファ、ベータなどを属性にします。

于 2013-06-21T11:31:45.533 に答える
0

myFunctionクラスに入れる必要があります。適切な属性を使用してクラスをセットアップし、適切な関数を呼び出します。その場合、状態はクラスに適切に含まれます。

于 2013-06-21T11:36:17.377 に答える