Python 和封闭变量

标签 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()

我希望它打印“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/

相关文章:

python - 从抓取结果中删除 "u'\n'"

python - python 闭包中的 cell_contents

typescript - 如何将函数参数的类型与某个枚举值关联起来?

javascript - 无法理解 console.log 中带/不带闭包的函数行为

python - 如何在 Python 中的新型类上正确覆盖 __setattr__ 和 __getattribute__?

python - 如何更改 PIP 以使用 Python 2.7

python - 在 Python 中使用缓冲区写入文件

python - 为 Pandas DataFrame 图设置 xlim

python idastar vs astar解决8个难题

python - 我如何告诉 Python 2 中的 dict() 使用 unicode 而不是字节字符串?