Python 3.x Python中的作用域和命名空间
在浏览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 =
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(),则会得到非局部值。