名字空间的含义。名称绑定、名称解析

一个作用域对应一个名字空间  注:名字空间相当于(key,value)字典

一个模块是一个作用域,模块中有一个名字空间

一个类是一个作用域,类中有一个名字空间

一个函数内部是一个作用域,对应一个名字空间

名称绑定相当于往字典中添加(key,value)

名称绑定的情形: 

1、变量赋值,定义函数,定义类的时候

2、传参的时候,名称绑定到函数的作用域

3、import语句的时候,把import后面的名称绑定到当前名称空间

4、其他情况,略

名称解析的过程:

相当于查找字典中的(key,value)

查找顺序为LEGB(local, Enclosing,Globle,Build-in)   名称绑定到一个代码块中,那么是局部变量,如果绑定到模块级别那么就是全局变量

#Enclosing:非局部也非全局变量
#两个嵌套函数,内层函数可能搜索外层函数的namespace但该namespace对内层函数而言既非全局也非局部
def  closure(str):     # str对内层来说即非全局也非局部
  def decrator(func):
    def wrapper():
      ....
      if (str)  # 解析的时候先查找本地的str(local),再查找Enclosing的str
        func()
      else
        ....
      ....
    return wrapper
  return decrator

如果先解析到了变量,而绑定在解析之后,会报错UnboundLocalError 

4.内建名字空间

在查找内建名字空间的时候,会访问当前代码块的全局名字空间中的 __builtins__名字,这个名字引用的是一个名字字典或者是一个模块。在 __main__ 模块中, __builtins__ 的引用是内建模块 builtins,然而,如果是在其他模块中, __builtins__ 引用的是 builtins 模块的名字字典。

print(globals())

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000211B0F0>, '__spec__': None, '__annotations__': {},

'__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/PycharmProjects/15group/level_2/day2/core/mm/aaad.py', '__cached__': None}
import builtins
print(builtins.abs(-2))  #内建模块可以调用内置方法

注意:
CPython的实现中,不能手动修改 __builtins__ 这个变量,如果需要覆盖这个内建名字空间中的名字,需要导入 builtins 模块,然后修改这个模块中相应的属性。

原文地址:https://www.cnblogs.com/revo/p/7155747.html