七、作用域

作用域

全局作用域/局部作用域

按照名字作用范围的不同可以将三个名称空间划分为两个区域:

  1. 全局作用域:位于全局名称空间、内建名称空间中的名字属于全局范围,该范围内的名字全局存活(除非被删除,否则在整个文件执行过程中存活)、全局有效(在任意位置都可以使用);
  2. 局部作用域:位于局部名称空间中的名字属于局部范围。该范围内的名字临时存活(即在函数调用时临时生成,函数调用结束后就释放)、局部有效(只能在函数内使用)。

作用域与名字查找优先级

在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,没有找到

再去全局作用域查找:先查找全局名称空间,没有找到

再查找内置名称空间,最后都没有找到就会抛出异常

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

提示:

  1. 可以调用内建函数locals()和globals()来分别查看局部作用域和全局作用域的名字,查看的结果都是字典格式。
  1. 在全局作用域查看到的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
posted @ 2021-05-24 22:28  zzwYYYYYY  阅读(103)  评论(0)    收藏  举报