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

Dha*_*ara 69 python scope

在下面的第二种情况下,Python试图寻找一个局部变量.当它没有找到一个时,为什么它不能像在第一种情况下那样在外部范围内看?

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

def f1():
    x = 5
    def f2():
         print x
Run Code Online (Sandbox Code Playgroud)

这给出了local variable 'x' referenced before assignment错误:

def f1():
    x = 5
    def f2():
        x+=1
Run Code Online (Sandbox Code Playgroud)

我不允许修改函数f2()的签名,所以我不能传递和返回x的值.但是,我确实需要一种方法来修改x.有没有办法明确告诉Python在外部范围内查找变量名称(类似于global关键字)?

Python版本:2.7

hoc*_*chl 76

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

def f1():
        x = 5
        def f2():
                nonlocal x
                x+=1
        return f2
Run Code Online (Sandbox Code Playgroud)

这篇文章给出了Python 2.x的问题及其解决方案.此外,请阅读PEP 3104以获取有关此主题的更多信息.

  • @ user1320237全局不起作用而不是非本地 - 这正是我的问题! (5认同)
  • 我刚查了这个。`nonlocal` 是这里使用的语句。 (2认同)

Tom*_*ock 56

def f1():
    x = { 'value': 5 }
    def f2():
        x['value'] += 1
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为使用`nonlocal`或`global`更为正确 (6认同)
  • 全局不是一个好主意,因为它会污染全局命名空间.Nonlocal是一个python 3特性,这个问题指定了python 2.7. (3认同)
  • 这是可行的,尽管我最终使用了带有单个元素的列表而不是字典。谢谢! (2认同)
  • *global* 在 py2.7 中不能用于问题目的,但是在父作用域上写 `x['value']` 比仅仅写 `value` 更难,所以考虑将值传递给嵌套函数,然后只返回 ` value` 从嵌套作用域到父作用域 (2认同)