关于python3.6 官方文档scope and namespaces的示例中遇到的问题?

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)
  1. 为什么执行do_local()打印的是test spam而不是local spam
  2. 执行do_global()时,由于该函数中重新将spam这个变量声明为全局变量,如果是这样的话为什么打印的是nonlocal spam而不是test spam.
阅读 2.1k
1 个回答

首先,print("After local assignment:", spam) 每次都是先寻找当前作用域的 spam,也就是:

def scope_test():
    ...
    spam = "test spam"  # 给这个 spam 取个代号:spam_4
    ...
    print("After local assignment:", spam) # 始终打印上面这个 spam_4 的值
    print("After nonlocal assignment:", spam) # 始终打印上面这个 spam_4 的值
    print("After global assignment:", spam) # 始终打印上面这个 spam_4 的值

回答第一个问题:
do_local() 内部的 spam 作用域仅仅为这个 do_local()内部,因此没有给 spam_4 赋值,所以打印 test_spam
回答第二个问题:
在执行do_nonlocal()里面,spam_4 已经赋值为 nonlocal spam
do_global()里面的赋值没有改变 spam_4 的值,因此还是打印 nonlocal spam

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进