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()