10下 名称空间与作用域

一、名称空间:Namespace,存放名字与内存地址绑定关系的地方

1.内置名称空间:

   存放的名字:存放的python解释器内置的名字

   存活周期:python解释器启动则产生,python解释器关闭则销毁

print(len)
print(input)

2.全局名称空间

   存放的名字:只要不是函数内定义的,,也不是内置的,剩下的都是全局名称空间的名字

   存活周期:python文件执行则产生,python文件运行完毕后销毁

 x=100
 def f1():
     y=200

 if 10>3:
     z=300
     if True:
         xxx=400

3.局部名称空间

   存放的名字:在调用函数时,运行函数体代码产生的函数内的名字

   存活周期:在调用函数时存活,函数调用完毕后则销毁

 def f1():
     x=200
 f1()

 

4.名称空间的加载顺序:内置名称空间——全局名称空间——局部名称空间

5.销毁顺序: 局部名称空间———全局名称空间——内置名称空间

6.名字的查找优先级:当前所在的位置向上一层一层查找

   如果当前在局部名称空间:局部名称空间———全局名称空间——内置名称空间

   如果当前在全局名称空间:全局名称空间——内置名称空间

 

重要的总结1:局部local——》外层函数enclosing——》全局global——》内置函数Builtin
# =======>LEGB

 

# 例1:
# def f1():
#     len=200
#     print(len)
# len=100
# f1()

#例2:LEGB
# len=100
# def f1():
#     len=200
#     def f2():
#         len=300
#         print(len)
#     f2()
# f1()

 

 

 

重要的总结2:名称空间的嵌套关系是在函数定义阶段、扫描语法时就确定好的,与调用位置无关

 

# 例1:
# len=100
# def f1():
#     #len=200
#     def f2():
#         print(len)
#     return f2
# f=f1()
# print(f)
# len=666666
# f()

#例2:
# len =100
# def f1():
#     def f2():
#         len=300
#         print(len)
#     len=200
#     return f2
# f=f1()
# f()

# #例3
# x=100
# def f1():
#     x = 200
#     print(x)
#
# f1()

 

 

 

二、作用域

1.全局作用域与局部作用域

2.作用域与名字查找的优先级

重点1:名词查找:当前所在的位置向外查找

       2.名称空间只有优先级之分,本身并无嵌套关系,画图只是为了理解

       3.名称空间的嵌套关系决定了名字的查找关系,

         而名称空间的嵌套关系是以函数定义阶段为准的,

         即函数的嵌套关系与名字的查找顺序是在定义阶段就已经确定好的

 

 

全局作用域:内置名称空间+全局名称空间的名字

    全局存活,全局有效

局部作用域:局部名称空间

  临时存活,局部有效

# ======》global关键字
# l = []
# x = 100
#
# def foo():
#     l.append(333)
#
#     global x
#     x = 200
#
# foo()
#
# print(l)
# print(x)

# ==========》nonlocal关键字
x=111
def f1():
    #X=222
    def f2():
        nonlocal x  #报错,只在E那层找
        x=333
    f2()
    print("========>f1肚子里的x: ",x)
f1()

 

       

posted @ 2021-08-09 19:35  甜甜de微笑  阅读(37)  评论(0编辑  收藏  举报