0

このスニペットを見てください:

def recur(n):
    ds = {}
    x=do_foo(n)
    if foo(n): ds[n] = recur(x)
    else: return x

私が聞きたいのは、最初の反復で ds が空であり、true の場合は何らかの条件で追加されることです。繰り返される場合、2 番目の反復で at に入りds[n] = recur(x)、この n 番目の反復で ds は ds = {} として再度定義されます。または ds は以前の要素を保持します。そうでない場合、要素を保持する方法は?

4

3 に答える 3

2

投稿したコードは有効な Python ではないため、ここで何が必要かを伝えるのは非常に困難ですが、呼び出しを通じて何らかのキャッシュを渡す方法を尋ねていると思います。

これを行う方法は、キャッシュをオプションのパラメーターにすることです。そうすれば、キャッシュなしで関数を呼び出すか、再帰呼び出しに渡すことができます。

def recur(n, ds=None):
    if ds is None: ds = {}
    x=do_foo(n)
    if foo(n):
        ds[n] = recur(x, ds)
    else:
        return x

または、キャッシュが保持される期間を完全に制御できるクラスを使用します。

class Bar(object):
    def __init__(self):
        self.ds = {}

    def recur(self, n):
        x=do_foo(n)
        if foo(n):
            self.ds[n] = self.recur(x)
        else:
            return x
于 2013-10-17T12:57:59.907 に答える
1

ds関数に引数として追加します。

def recur(n, ds=None):
    ds = ds or {}
    #...
    recur(n, ds=ds)
于 2013-10-17T13:00:26.283 に答える
0

他のプログラミング言語と同様に、関数内には、関数の実行中にのみ存在する変数があります。これらはローカル変数ですdsここではローカル変数であり、関数の実行時にのみ存在します。関数を再度実行するたびにds、最初のものとは異なります (同じプログラムの 2 つのインスタンスを実行していると想像してください。同じパラメーターを設定しても、2 つの異なる状況があります)。

問題を解決するには、次の 2 つの方法があります。

  • dsグローバル (関数外) として宣言しglobal ds、関数の最初の行のように参照します。
  • dsパラメータとして関数に渡します (これは、この状況に対処するための最良の代替手段です)
于 2013-10-17T13:04:52.807 に答える