为什么嵌套函数可以访问外部函数的变量,但不允许修改它们[重复]

问题描述 投票:0回答:2

在下面的第二种情况中,Python 尝试寻找局部变量。当它找不到时,为什么它不能像第一种情况那样在外部范围中查找?

这会在本地范围中查找 x,然后在外部范围中查找:

def f1():
    x = 5
    def f2():
         print x

这会产生

local variable 'x' referenced before assignment
错误:

def f1():
    x = 5
    def f2():
        x+=1

我不允许修改函数 f2() 的签名,因此我无法传递和返回 x 的值。但是,我确实需要一种修改 x 的方法。有没有办法明确告诉Python在外部作用域中查找变量名(类似于

global
关键字)?

Python版本:2.7

python scope python-2.x
2个回答
193
投票

在 Python 3.x 中这是可能的:

def f1():
        x = 5
        def f2():
                nonlocal x
                x+=1
        return f2

this 帖子中给出了该问题及其解决方案(对于 Python 2.x 也是如此)。此外,请阅读 PEP 3104 了解有关此主题的更多信息。


85
投票
def f1(): x = { 'value': 5 } def f2(): x['value'] += 1

解决方法是使用可变对象并更新该对象的成员。有时,Python 中的名称绑定很棘手。

© www.soinside.com 2019 - 2024. All rights reserved.