七、作用域
作用域
全局作用域/局部作用域
按照名字作用范围的不同可以将三个名称空间划分为两个区域:
- 全局作用域:位于全局名称空间、内建名称空间中的名字属于全局范围,该范围内的名字全局存活(除非被删除,否则在整个文件执行过程中存活)、全局有效(在任意位置都可以使用);
- 局部作用域:位于局部名称空间中的名字属于局部范围。该范围内的名字临时存活(即在函数调用时临时生成,函数调用结束后就释放)、局部有效(只能在函数内使用)。
作用域与名字查找优先级
在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,没有找到
再去全局作用域查找:先查找全局名称空间,没有找到
再查找内置名称空间,最后都没有找到就会抛出异常
x=100 # 全局作用域的名字x
def foo():
x=300 # 局部作用域的名字x
print(x) # 在局部找x
foo() # 结果为300
在全局作用域查找名字时,起始位置便是全局作用域,所以先查找全局名称空间,没有找到
再查找内置名称空间,最后都没有找到就会抛出异常
x=100
def foo():
x=300 # 在函数调用时产生局部作用域的名字x
foo()
print(x) # 在全局找x,结果为100
提示:
- 可以调用内建函数locals()和globals()来分别查看局部作用域和全局作用域的名字,查看的结果都是字典格式。
- 在全局作用域查看到的locals()的结果等于globals()
Python支持函数的嵌套定义,在内嵌的函数内查找名字时,会优先查找自己局部作用域的名字,
然后由内而外一层层查找外部嵌套函数定义的作用域,没有找到,则查找全局作用域
x=1
def outer():
x=2
def inner(): # 函数名inner属于outer这一层作用域的名字
x=3
print('inner x:%s' %x)
inner()
print('outer x:%s' %x)
outer()
# 结果为
inner x:3
outer x:2

浙公网安备 33010602011771号