在Python中是否存在类似'nonlocal'的东西< 3?

时间:2012-03-07 14:27:52

标签: python python-nonlocal

我得到了一段这样的代码:

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() # ...

我发现在最外层的scop中定义foo很难看,我更愿意只在outer函数中使用它。据我理解,在Python3中,这是由nonlocal完成的。对于我想拥有的东西,有更好的方法吗?我希望在foo中声明并分配outer,并在global中对inner进行delcare {<1}}:

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

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:4)

不,将此作为make_id功能的参数。更好的是将你的id放在一个类中,并将make_id作为实例方法,并将该实例作为全局(如果必须)。

答案 2 :(得分:0)

不,它的最佳选择是功能属性。