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

 

python三个空间如下:

全局空间

在py文件中, 函数外声明外都属于全局命名空间

1 a = 1 #记录在全局空间
  2 b = 2 #记录在全局空间
  3 
  4 def func():  #func记录在全局空间
  5      c = 1   #此时不再任何空间中,当运行函数时会创建临时命名空间进行存储
  6 print(111111)
  7



临时命名空间

        在函数中声明的变量会放在局部命名空间,当调用到该函数就会在内存中开辟一个临时空间记录函数的变量信息,当函数结束时空间也随着消失

def func():

       aaa = 1  当运行函数时候才会被记录



内置命名空间

      python解释器为我们提供的名字, list, tuple, str, int, print这些都是内置命名空间  .  这些函数我可以直接使用并不需要导入什么文件.

      内置空间中的函数比如builtins.py文件


命名空间加载顺序:

   内置命名空间------>全局空间-------->局部空间


取值顺序

就进原则取值  局部空间—>全局空间——>内置空间

1 a=1
  2 def func():
  3    a=2 #创建a对象并复制为2
  4       print(a) #输出2,当局部空间能找到该变量那么就用这个,找不到就往上层找



作用域

python可以分两种作用域

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

局部作用域: 局部空间


局部作用域可以使用全局作用域的变量,反过来则不行

1 def func1():
  2      a = 1
  3      def func2():
  4             print(a)  使用func1空间中的变量
  5 
  6      func2()
  7 func1()



globals 和 locals

globals 返回字典格式,内容是全局作用域

>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <cl
ass '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {
}, '__builtins__': <module 'builtins' (built-in)>, 'func': <function func at 0x0
00000D4BEEEC1E0>, 'a': 1, 'b': 2}



locals 返回字典格式,内容是当前作用域

>>> def func_local():
...      a=1
...      print(locals())
...
>>> func_local()
{'a': 1}
>>>