Python 3.x Python中的作用域和命名空间

Python 3.x Python中的作用域和命名空间,python-3.x,Python 3.x,在浏览Python范围文档时,我遇到了以下代码,但我不确定该代码的执行方式。有人能解释一下这个代码吗 def scope_test(): def do_local(): spam = "local spam" def do_nonlocal(): nonlocal spam spam = "nonlocal spam" def do_global(): global spam spam =

在浏览Python范围文档时,我遇到了以下代码,但我不确定该代码的执行方式。有人能解释一下这个代码吗

def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)

最简单的方法-运行程序 这是输出:

After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
如您所见,非本地在定义的范围内具有优先级。一旦输出,将使用全局定义。无需重置全局值,这是自动完成的。当然,非本地会覆盖本地赋值


编辑:有关更多信息,请参阅。

您的问题是什么?仍然不明白为什么会出现这种情况。你能详细解释一下为什么这是一步一步的输出吗?为什么我们调用do_local(),为什么垃圾邮件没有改变?当我们调用do_global()时,为什么在scope_测试中,它仍然是非局部的,但实际上spam变成了全局spam?从Python文档中可以看出:“nonlocal语句使列出的标识符引用最近的封闭范围中的先前绑定变量,不包括全局变量”。在本例中,“最近的封闭范围”是scope_test()函数。因此,在这个函数中的任何地方,我们都会得到非局部值,即使在设置了全局值之后。最后一个调用来自全局范围,因此该值就是全局值。第一个调用是执行_local(),然后再将字段设置为非本地,这样我们就得到了本地值。如果最后再次尝试调用do_local(),则会得到非局部值。