19

我想在嵌套函数中定义变量以在嵌套函数中进行更改,例如

def nesting():
    count = 0
    def nested():
        count += 1

    for i in range(10):
        nested()
    print count

调用嵌套函数时,我希望它打印 10,但它会引发 UnboundLocalError。关键字 global 可以解决这个问题。但是由于变量 count 仅在嵌套函数的范围内使用,我希望不要将其声明为全局的。这样做的好方法是什么?

4

3 回答 3

24

在 Python 3.x 中,您可以使用nonlocal声明 (in nested) 告诉 Python 您的意思是分配给 in 中的count变量nesting

在 Python 2.x 中,您根本无法分配给countin nestingfrom nested。但是,您可以通过不分配给变量本身,而是使用可变容器来解决它:

def nesting():
    count = [0]
    def nested():
        count[0] += 1

    for i in range(10):
        nested()
    print count[0]

尽管对于非平凡的情况,通常的 Python 方法是将数据和功能包装在一个类中,而不是使用闭包。

于 2011-06-01T09:09:11.053 回答
5

有点晚了,您可以将属性附加到“嵌套”函数,如下所示:

def nesting():

    def nested():
        nested.count += 1
    nested.count = 0

    for i in range(10):
        nested()
    return nested

c = nesting()
print(c.count)
于 2014-10-04T08:56:20.923 回答
0

对我来说最优雅的方法:在两个 python 版本上都 100% 工作。

def ex8():
    ex8.var = 'foo'
    def inner():
        ex8.var = 'bar'
        print 'inside inner, ex8.var is ', ex8.var
    inner()
    print 'inside outer function, ex8.var is ', ex8.var
ex8()

inside inner, ex8.var is  bar
inside outer function, ex8.var is  bar

更多: http: //www.saltycrane.com/blog/2008/01/python-variable-scope-notes/

于 2016-09-16T19:50:05.510 回答