3

私はこのようなコードを手に入れました:

foo = None

def outer():
    global foo
    foo = 0

    def make_id():
        global foo
        foo += 1
        return foo


    id1 = make_id() # id = 1
    id2 = make_id() # id = 2
    id3 = make_id() # ...

foo最も外側のスコープで定義したのは醜いので、outer機能しているだけにしておきたいと思います。私が正しく理解しているように、Python3ではこれはによって行われnonlocalます。私が欲しいもののためのより良い方法はありますか?私は宣言して割り当てfoo、そして多分それをouterデルケアしたいと思います:globalinner

def outer():
    foo = 0

    def make_id():
        global foo
        foo += 1     # (A)
        return foo

    id1 = make_id() # id = 1
    id2 = make_id() # id = 2
    id3 = make_id() # ...

(A)動作せずfoo、最も外側のスコープで検索されているようです。

4

3 に答える 3

6

この目的のために、1 要素リストを使用します。

def outer():
    foo = [0]
    def make_id():
        r = foo[0]
        foo[0] += 1
        return r
    return make_id

make_id = outer()
id1 = make_id()
id2 = make_id()
...

これは を使用するのと同じですが、 (の代わりに)nonlocal少し面倒な構文が必要です。foo[0]foo

于 2012-03-07T14:41:24.403 に答える
4

いいえ、これをmake_id関数のパラメーターとして使用してください。ID をクラスに入れmake_id、インスタンス メソッドとして使用し、そのインスタンスをグローバルとして使用することをお勧めします (必要な場合)。

于 2012-03-07T14:34:26.940 に答える
0

いいえ、そのための最良の代替手段は関数属性です。

于 2012-03-07T14:29:19.537 に答える