如果一个名称被声明为全局变量,则所有引用和赋值将直接指向包含该模块的全局名称的中间作用域。要重新绑定在最内层作用域以外找到的变量,可以使用nonlocal语句声明为非本地变量。如果没有被声明为非本地变量,这些变量将是只读的(尝试写入这样的变量只会在最内层作用域中创建一个新的局部变量,而同名的外部变量保持不变)。
通常,当前局部作用域引用当前函数的局部名称,在函数外,局部作用域将引用与全局作用域一致的命名空间:模块的命名空间。类定义将在局部空间内再放置另一个命名空间。
Python一个特殊规定是这样的,如果不存在生效的global或nonlocal语句——则对名称的赋值总是会进入最内层作用域。赋值不会复制数据——它们只是将名称绑定到对象。
gloab 语句可被用来表示特定变量生存于全局作用域并且应当再其中被重新绑定, nonlocal 语句表示特定变量生存于外层作用域并且应当在其中被重新绑定。
def scope_test():
def do_local():
spam = 'loca spam'
def do_nonlocal():
nonlocal spam
spam = 'nonlocal spam'
def do_global():
global spam
spam = 'global spam'
spam = 'test spam' ## line13
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)
具体过程如下:(如果哪里有不对的欢迎指出,谢谢)
参考资料:
【1】Python Document:9. Classes