<分区>
看看这段代码:
def closure():
value = False
def method_1():
value = True
def method_2():
print 'value is:', value
method_1()
method_2()
closure()
我希望它打印“Value is: True”,但它没有。为什么会这样,解决方案是什么?
<分区>
看看这段代码:
def closure():
value = False
def method_1():
value = True
def method_2():
print 'value is:', value
method_1()
method_2()
closure()
我希望它打印“Value is: True”,但它没有。为什么会这样,解决方案是什么?
最佳答案
发生这种情况是因为 method_1
获得了自己的本地范围,它可以在其中声明变量。 Python 看到 value = True
并认为您正在创建一个名为 value
的新变量,局部于 method_1
。
Python 这样做的原因是为了避免内部函数的变量污染外部作用域的局部变量。 (您不希望常规的模块级函数中的赋值导致创建全局变量!)
如果您不分配给 value
,则 Python 会搜索外部作用域以查找变量(因此读取变量会按预期工作,如您的 method_2
).
解决这个问题的一种方法是使用可变对象而不是赋值:
result = { 'value': False }
def method_1():
result['value'] = True
在 Python 3 中,nonlocal
statement (另请参阅 docs)正是为这种情况添加的:
def method_1():
nonlocal value
value = True # Works as expected -- assigns to `value` from outer scope
关于Python 和封闭变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6831950/