Python,我如何在父级作用域中更改变量的值?

13
例如:赋值语句将声明一个新的局部变量。
foo = 'global'
def func1():
    foo = 'func1'
    def func2():
        foo = 'local variable in func2'

使用全局声明将使用全局中的 foo:

def func2():
    global foo
    foo = 'global changed in func2'  #changed the foo value in global scope

如何在func1作用域内更改变量foo?
非常感谢任何帮助。

编辑:

感谢Brandon Craig Rhodes,我终于理解你的意思了。

如果嵌套超过3个作用域,可以将变量存储在列表中。

foo = ['global', 'function1', 'function2']
def func1():
    foo[1] = 'func1'
    def func2():
        foo[2] = 'func2'
        foo[1] = 'func1 modified in func2'

我实际上只使用了全局变量。


所以,如果有两个嵌套的函数,我们可以使用

nonlocal foo 
并且
global foo 

如果有三个以上的函数嵌套,并且每个函数都使用其他函数作用域中的变量,
那么为什么我们不声明一个全局列表变量呢?
非常感谢您的帮助!!!

2个回答

18

在Python 3中,您可以使用 nonlocal 关键字获得修改封闭非全局作用域中变量的权限。 在Python 2中,无法重新分配封闭作用域中的 foo 变量; 相反,将 foo 设置为可变对象,如列表[],然后将要存储在列表中的值插入其中:

def func1():
    foo = [None]
    def func2():
        foo[0] = 'Test'

谢谢,那真的很有帮助。但是假设有超过3个嵌套的函数怎么办?您能再帮忙一下吗?谢谢。 - netroyal
感谢您,我终于明白了您的意思。如果有两个以上的函数嵌套,您可以使用foo[1, 2, 3]来存储foo[0]、foo[1]和foo[2]中的每个值。再次感谢! - netroyal

9

在Python 3.0及以上版本中,您可以使用nonlocal关键字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接