如何从嵌套闭包中修改局部变量?

时间:2013-07-18 14:33:38

标签: python-3.x functional-programming closures nested-function

请考虑以下代码示例:

def testClosure():
    count = 0

    def increment():
        count += 1

    for i in range(10):
        increment()

    print(count)    

调用此结果:

Traceback (most recent call last):
  File "/Users/cls/workspace/PLPcython/src/sandbox.py", line 23, in <module>
    testClosure()
  File "/Users/cls/workspace/PLPcython/src/sandbox.py", line 18, in testClosure
    increment()
  File "/Users/cls/workspace/PLPcython/src/sandbox.py", line 15, in increment
    count += 1
UnboundLocalError: local variable 'count' referenced before assignment

我习惯于使用C ++编写这样的代码:

void testClosure() {
    int count = 0

    auto increment = [&](){
        count += 1;
    };

    for (int i = 0; i < 10; ++i) {
        increment();
    }

}

我做错了什么?是否无法从内部函数修改外部函数的局部变量?这些不同类型的闭包(Python vs C ++)?

1 个答案:

答案 0 :(得分:2)

如果你这样做的话我就开始工作了:

def testClosure():
    count = 0

    def increment():
        nonlocal count
        count += 1

    for i in range(10):
        increment()

    print(count)
testClosure()

请注意,这只适用于Python 3.x,但您显然正在使用它,所以它不是问题。