【名称空间的介绍】
1 名称空间:namespacs:存放名字的地方,是对栈区的划分,有了名称空间以后,就可以在栈区存放相同的名字
2 1.内置名称空间:存放的名字:存放的python解释器内置的名字,如:print、input、remove等 3 存活周期:ptthon解释器启动则产生,python解释器关闭则销毁
4 2.全局名称空间:存放的名字:运行顶级代码所产生的名字,不是函数内定义、也不是内置的,剩下的都是全局名称空间 5 如:impor os、def unf()、x=10、class foo 6 def unf() 属于全局名称空间 7 a=11 8 b=22 a和b就不属于全局名称空间 9 存活周期:python文件执行则产生,python文件运行完毕后则销毁
10 3.局部名称空间:存放的名字:在调用函数时,运行函数体代码过程中产生的函数内的名字 11 存活周期:在调用函数时存活,函数调用完毕后销毁 12 def unf() 属于全局名称空间 13 a=11 14 b=22 a和b属于局部名称空间 15 ===================================================================================== 16 名称空间的加载顺序:内置名称空间>全局名称空间>局部名称空间 17 名字查找的优先级:当前所在的位置向上一层一层查找 18 input=333 内置名称空间 19 def unf(): 全局名称空间 20 input=444 局部名称空间 21 print(input) 局部名称空间 22 unf() 运行结果是444,按照当前位置一层一层向上查找
。
。
【 名称空间的嵌套关系】
涉及到名称查找顺序
。
。
。
。
【作用域】
global作用: 局部名称空间修改全局名称空间
nonlocal作用: 局部内层名称空间修改局部外层名称空间
======================================================================================================应用:
1 money = 666 2 def index(): 3 money = 123 4 index() 5 print(money) 6 666 7 8 如果想实现在:局部名称空间直接修改全局名称空间中的数据,global代码实现如下: 9 money = 666 10 def index(): 11 global money # 加了一个global告诉程序,一旦涉及到global后面的变量名money的绑定关系,就不会在局部空间里面再创建新的了,而是直接改全局名称空间里面money对应的绑定值。 12 money = 123 13 index() # 调用函数,执行函数体代码,由于加了global所以money=3直接改了全部名称空间里面的money=6 14 print(money) # 函数体代码执行完了后,此时print打印的全局名称空间里面的money已经被改成123了 15 123 16 # 17 # 18 def index(): 19 name = 'jason' # name变量名存到index的局部名称空间,指向'jason' 20 def inner(): 21 name = 'kevin' # 这时候局部名称空间里面又套了inner一个局部名称空间里面也保存了一个变量名name,指向'kevin' 22 inner() 23 print(name) # 这个时候,在index的局部名称空间里,从index的局部名称空间里面找变量名name,所以找到的值为'jason' 24 index() 25 jason 26 27 如果想实现在:内层局部名称空间直接修改外层局部名称空间中的数据,nonlocal代码实现如下: 28 def index(): 29 name = 'jason' 30 def inner(): 31 nonlocal name 32 # 告诉程序name在后续赋值时,变量名不会放在内层局部空间, 33 # 而是放到它的外层局部名称空间去,如果外层原来有name的绑定关系, 34 # 解除原来的关系,用内层赋值的关系。 35 name = 'kevin' # 这时候已经通过内层name的绑定改了外层name的绑定关系了 36 inner() # 所以inner函数体代码执行完了后,外部name绑定关系已经变调了 37 print(name) # 在index的内部名称空间找name变量名对应的值,kevin 38 index() 39 kevin