【名称空间的介绍】

 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

 

posted on 2023-11-16 21:36  认真的六六  阅读(3)  评论(0编辑  收藏  举报