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

13 投票
2 回答
7771 浏览
提问于 2025-04-16 14:05

比如说:赋值语句会声明一个新的局部变量。

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,我终于明白你的意思了。

如果有超过三个嵌套的范围,我可以把变量存储在一个列表里。

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 个回答

9

在Python 3.0及以上版本中,你可以使用一个叫做nonlocal的关键词。

18

在Python 3中,我认为你可以使用nonlocal这个关键词来获得修改一个外层非全局范围内变量的权限。在Python 2中,你不能直接在外层范围内重新赋值给foo; 相反,你可以把foo设置为一个可变对象,比如一个列表[],然后把你想要存储的值放进这个列表里:

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

撰写回答