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. 对于我想要的东西,有没有更好的方法?我更愿意声明和分配fooouter也许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()
...

这与 using 相同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 回答