Python-命名空间

命名空间
在python解释器开始执行行之后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就
把变量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内
存, 表示这个函数存在了了, 至于函数内部的变量和逻辑, 解释器是不关心的.也就是说一开始
的时候函数只是加载进来, 仅此而已, 只有当函数被调用和访问的时候, 解释器才会根据函数
内部声明的变量来进行行开辟变量的内部空间.随着函数执行行完毕, 这些函数内部变量占用的空
间也会随着函数执行行完毕而被清空.

我们给存放名字和值的关系的空间起一个名字叫: 命名空间.我们的变量在存储的时候就是存储在这片空间中的.命名空间分类:
1.全局命名空间 --> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间
2.局部命名空间 --> 在函数中声明的变量会放在局部命名空间
3.内置命名空间 --> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
加载顺序:
1.内置命名空间
2.全局命名空间
3.局部命名空间(函数被执⾏行行的时候)
取值顺序:
1.局部命名空间
2.全局命名空间
3.内置命名空间
作用域:
1.全局作用域: 全局命名空间 + 内置命名空间
2.局部作用域: 局部命名空间
函数:
globals,通过globals()函数来查看全局作用域中的内
locals,通过locals()函数来查看局部作用域中的变量和函数信息
gloabal, nonlocal关键字
gloabal表⽰. 不再使⽤用局部作⽤用域中的内容了了. ⽽而改⽤用全局作⽤用域中的变量
1 a = 1
2 def func():
3     global a
4     print(a)
global
    nonlocal表示在局部作⽤用域中, 调⽤用⽗父级命名空间中的变量.
 1 # nonlocal
 2 a = 0
 3 def outer():
 4     a = 1
 5     def inner():
 6         a = 2
 7         def inner2():
 8             nonlocal  a  #声明了一个上面第一层局部变量
 9             a += 1   #不可变数据类型的修改
10         inner2()
11         print('##a## : ', a)
12     inner()
13     print('**a** : ',a)
14 
15 outer()
16 print('全局 :',a)
17 # ##a## :  3
18 # **a** :  1
19 # 全局 : 0
nonlocal

 

posted @ 2018-09-19 22:58  写bug的日子  阅读(154)  评论(0编辑  收藏  举报