Python和封闭变量

Lee*_*eil 6 python closures python-2.x

看看这段代码:

def closure():
    value = False

    def method_1():
        value = True

    def method_2():
        print 'value is:', value

    method_1()
    method_2()

closure()
Run Code Online (Sandbox Code Playgroud)

我希望它能打印'Value is:True',但事实并非如此.为什么这个和解决方案是什么?

Cam*_*ron 17

发生这种情况是因为method_1它可以在声明变量的地方获得自己的局部范围.Python看到value = True并认为你正在创建一个名为valuelocal 的新变量method_1.

Python这样做的原因是为了避免使用内部函数中的变量污染外部作用域的本地.(您不希望在常规的模块级函数中进行赋值,从而导致创建全局变量!)

如果你没有分配value,那么Python搜索外部范围寻找变量(因此读取变量按预期工作,如你所示method_2).

解决这个问题的一种方法是使用可变对象而不是分配:

result = { 'value': False }

def method_1():
    result['value'] = True
Run Code Online (Sandbox Code Playgroud)

在Python 3中,nonlocal语句(另请参阅docs)已添加到此场景中:

def method_1():
    nonlocal value
    value = True    # Works as expected -- assigns to `value` from outer scope
Run Code Online (Sandbox Code Playgroud)