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

net*_*yal 8 python scope global python-nonlocal

例如:assginment语句将声明一个新的局部变量.

foo = 'global'
def func1():
    foo = 'func1'
    def func2():
        foo = 'local variable in func2'
Run Code Online (Sandbox Code Playgroud)

使用全局声明将在全局使用foo:

def func2():
    global foo
    foo = 'global changed in func2'  #changed the foo value in global scope
Run Code Online (Sandbox Code Playgroud)

如何在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'
Run Code Online (Sandbox Code Playgroud)

我实际上只使用了一个全局变量.


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

nonlocal foo 
Run Code Online (Sandbox Code Playgroud)

和

global foo 
Run Code Online (Sandbox Code Playgroud)

如果嵌套了三个以上的函数,
并且每个函数在其他函数范围内使用变量,
为什么不声明全局列表变量?
谢谢你的帮助!!!

Bra*_*des 10

在Python 3中,我相信,您可以使用该nonlocal关键字来获取修改封闭非全局范围内的变量的权限.在Python 2中,您无法foo在封闭范围内重新分配; 相反,设置foo等于像列表一样的可变对象[],然后粘贴您想要存储在列表中的值:

def func1():
    foo = [None]
    def func2():
        foo[0] = 'Test'
Run Code Online (Sandbox Code Playgroud)


小智 5

在python 3.0及更高版本中,您可以使用nonlocal关键字。