zoukankan      html  css  js  c++  java
  • 13.Python中的命名空间是什么

    Python中的命名空间是什么?

    In Python,every name introduced has a place where it lives and can be hooked for.

    This is known as namespace. It is like a box where a variable name is mapped to the object placed.

    Whenever the variable is searched out, this box will be searched, to get corresponding object.

     

    namespace命名空间

    Namespace(只)是 从名字到对象的一个映射(a mapping from name to objects) 。大部分namespace都是按Python中的字典来实现的。

    有一些常见的namespace:built-in中的集合( abs() 函数等)、一个模块中的全局变量等。

    从某种意义上来说,一个对象(object)的所有属性(attribute)也构成了一个namespace。在程序执行期间,可能(其实是肯定)会有多个命名空间同时存在。不同namespace的创建/销毁时间也不同。

    此外,两个不同namespace中的两个相同名字的变量之间没有任何联系。

    scope作用域

    Scope是Python程序的一块文本区域(textual region)。

    在该文本区域中,对namespace是可以直接访问,而不需要通过属性来访问。

    Scope是定义程序该如何搜索确切地“名字-对象”的名空间的层级关系。
    (The “scope” in Python defines the “hirerchy level” in which we search namespaces for
    certain “name-to-object” mappings.)

    Tip

    直接访问:对一个变量名的引用会在所有namespace中查找该变量,而不是通过属性访问。

    属性访问:所有名字后加 . 的都认为是属性访问。

    如 module_name.func_name ,需要指定 func_name 的名空间,属于属性访问。
    而 abs(-1) , abs 属于直接访问。

     

    那什么是命名空间/作用域呢?

    这两个概念,是用来描述一个变量的属性的,它们的意思,就是字面意思:“这个变量起名字的地方/这个变量起作用的域”.

    LEGB-rule

    在一个Python程序运行中,至少有4个scopes是存在的。

    直接访问一个变量可能在这四个namespace中逐一搜索。

    • Local(innermost)
      包含局部变量。
      比如一个函数/方法内部。
    • Enclosing
      包含了非局部(non-local)也非全局(non-global)的变量。
      比如两个嵌套函数,内层函数可能搜索外层函数的namespace,但该namespace对内层函数而言既非局部也非全局。 
    • Global(next-to-last)
      当前脚本的最外层。
      比如当前模块的全局变量。 
    • Built-in(outtermost)
      Python __builtin__ 模块。
      包含了内建的变量/关键字等。 

    那么,这么多的作用域,Python是按什么顺序搜索对应作用域的呢?

    著名的”LEGB-rule”,即scope的搜索顺序:

    Important

    Local -> Enclosing -> Global -> Built-in

    怎么个意思呢?

    当有一个变量在 local 域中找不到时,Python会找上一层的作用域,即 enclosing 域(该域不一定存在)。enclosing 域还找不到的时候,再往上一层,搜索模块内的 global 域。最后,会在 built-in 域中搜索。对于最终没有搜索到时,Python会抛出一个 NameError 异常。

    作用域可以嵌套。比如模块导入时。

    这也是为什么不推荐使用 from a_module import * 的原因,导入的变量可能被当前模块覆盖。

    参考:http://www.cnblogs.com/sunchao1984/p/5377680.html

    http://python.jobbole.com/81367/

  • 相关阅读:
    java ssh整合报错:java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
    Ubuntu16.04安装搜狗输入法后有黑边问题的解决方法
    socket
    vim编辑器的使用
    linux用户和群组
    bash shell
    [LightOJ 1128]Greatest Parent
    [Luogu P4180][BJWC 2010]严格次小生成树
    函数、方法区别
    有关_meta内容(持续更新)
  • 原文地址:https://www.cnblogs.com/zoe233/p/7427052.html
Copyright © 2011-2022 走看看