在Python <3中有类似'nonlocal'的东西吗?

wal*_*mat 3 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() # ...
Run Code Online (Sandbox Code Playgroud)

我发现foo在最外面的scop中定义它很难看,我宁愿只在outer函数中使用它.据我所知,在Python3中,这是通过nonlocal.对于我想拥有的东西,有更好的方法吗?我更愿意申报和分配foo,outer并可能在delcare 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() # ...
Run Code Online (Sandbox Code Playgroud)

(A)不起作用,foo似乎在最外层范围内进行搜索.

lui*_*dro 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()
...
Run Code Online (Sandbox Code Playgroud)

这与使用相同nonlocal,代价是稍微麻烦的语法(foo[0]而不是foo).