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


    一个作用域对应一个名字空间  注:名字空间相当于(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 模块,然后修改这个模块中相应的属性。

  • 相关阅读:
    LeetCode Flatten Binary Tree to Linked List
    LeetCode Longest Common Prefix
    LeetCode Trapping Rain Water
    LeetCode Add Binary
    LeetCode Subsets
    LeetCode Palindrome Number
    LeetCode Count and Say
    LeetCode Valid Parentheses
    LeetCode Length of Last Word
    LeetCode Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/revo/p/7155747.html
Copyright © 2020-2023  润新知