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关键字。