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) # test spam
do_nonlocal()
print("After nonlocal assignment:", spam) # nonlocal spam
do_global()
print("After global assignment:", spam) # nonlocal spam
scope_test()
print("In global scope:", spam)
- 为什么执行
do_local()
打印的是test spam
而不是local spam
- 执行
do_global()
时,由于该函数中重新将spam
这个变量声明为全局变量,如果是这样的话为什么打印的是nonlocal spam
而不是test spam
.
首先,
print("After local assignment:", spam)
每次都是先寻找当前作用域的 spam,也就是:回答第一个问题:
do_local()
内部的spam
作用域仅仅为这个do_local()
内部,因此没有给 spam_4 赋值,所以打印test_spam
。回答第二个问题:
在执行
do_nonlocal()
里面,spam_4 已经赋值为nonlocal spam
。而
do_global()
里面的赋值没有改变 spam_4 的值,因此还是打印nonlocal spam
。