在阅读Python3教程时,我注意到global
和nonlocal
关键字之间存在差异。
如果我尝试以下代码,它会起作用:
# Does not need: spam = ''
def global_scope_test():
def do_global():
global spam
spam = 'global spam'
do_global()
global_scope_test()
print(spam)
而以下情况则不然:
def nonlocal_scope_test():
# Needs: spam = ''
def do_nonlocal():
nonlocal spam
spam = 'nonlocal spam'
do_nonlocal()
print(spam)
nonlocal_scope_test()
为什么允许global
在全局作用域中创建新绑定,而不允许nonlocal
在外部作用域中新建绑定?考虑到这两种功能的相似性,这似乎是一个奇怪的怪癖。教程似乎没有强调示例中的差异,我也找不到任何线程在谈论它。
非本地的文档对此很清楚:
非本地语句中列出的名称,不同于全局语句中的名称语句,必须引用封闭范围中预先存在的绑定(不能在其中创建新绑定的范围明确确定(。