1

考虑以下代码示例:

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++)吗?

4

1 回答 1

2

如果你这样做,我会得到它的工作:

def testClosure():
    count = 0

    def increment():
        nonlocal count
        count += 1

    for i in range(10):
        increment()

    print(count)
testClosure()

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

于 2013-07-18T14:47:18.253 回答