我一直在关注Python文档中的教程,但我遇到了有关使用global
和nonlocal
关键字的代码。我已经阅读了代码但我并不完全理解为什么有些代码可以完成它的工作。这是代码:
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_global()
来电之后,为什么spam
打印出nonlocal spam
?是不是要打印global spam
?
谢谢!
答案 0 :(得分:1)
do_global
调用分配全局变量(在所有函数之外的范围内定义的变量)。 scope_test
函数中的print函数仍然引用该函数本地范围内的spam
。
因此,由于global
关键字将值"global spam"
分配给全局垃圾邮件范围,因此更改不会应用于本地范围,并且仍会打印未更改的本地范围。
通过Python检查这一点的具体机制是在最本地范围内搜索变量,最后以全局范围结束。这就是为什么局部变量总是在同名的全局变量之前引用的原因。