Python 的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间。
作用域就是一个 Python 程序可以直接访问命名空间的正文区域。直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。
一个变量在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域
a1 = '全局变量a'
b1 = 10
def print1():
global b1 # 此处需要修改b1则申明为全局变量,外部函数不能用nonlocal
b1=b1+1
print(b1)
print(a1)
b = '爷闭包函数外变量b'
print(b)
def print2():
c = '父闭包函数变量c'
print('父函数打印-C: ',c)
def print3():
global d # global全局变量标识
d = '孙闭包函数变量d,申明为全局变量'
print(d)
nonlocal c # 局部作用域内的变量,修改上层变量,需 nonlocal 申明,及C为局部作用域的变量
c='孙函数修改父函数变量c'
print("孙函数打印-C: ",c)
print3()
print2()
print1()
print('外部打印全局变量d:', d)
11
全局变量a
爷闭包函数外变量b
父函数打印-C: 父闭包函数变量c
孙闭包函数变量d,申明为全局变量
孙函数打印-C: 孙函数修改父函数变量c
外部打印全局变量d: 孙闭包函数变量d,申明为全局变量
Process finished with exit code 0