zoukankan      html  css  js  c++  java
  • LEGB规则

    链接:https://www.cnblogs.com/GuoYaxiang/p/6405814.html

    命名空间

    大约来说,命名空间就是一个容器,其中包含的是映射到不同对象的名称。你可能已经听说过了,Python中的一切——常量,列表,字典,函数,类,等等——都是对象。
    这样一种“名称-对象”间的映射,使得我们可以通过为对象指定的名称来访问它。举例来说,如果指定一个简单的字符串  a_string = "Hello string",我们就创建了一个对象“Hello string”的引用,之后我们就可以通过它的名称a_string来访问它。

    命名空间也有不同的层次(也就是所谓的“作用域”)

    通过LEGB规则对变量名进行作用域解析

    我们已经知道了多个命名空间可以独立存在,而且可以在不同的层次上包含相同的变量名。“作用域”定义了Python在哪一个层次上查找某个“变量名”对应的对象。接下来的问题就是:“Python在查找‘名称-对象’映射时,是按照什么顺序对命名空间的不同层次进行查找的?”

    答案就是:使用的是LEGB规则,表示的是Local -> Enclosed -> Global -> Built-in,其中的箭头方向表示的是搜索顺序。


    Local 可能是在一个函数或者类方法内部。
    Enclosed 可能是嵌套函数内,比如说 一个函数包裹在另一个函数内部。
    Global 代表的是执行脚本自身的最高层次。
    Built-in 是Python为自身保留的特殊名称。


    因此,如果某个name:object映射在局部(local)命名空间中没有找到,接下来就会在闭包作用域(enclosed)进行搜索,如果闭包作用域也没有找到,Python就会到全局(global)命名空间中进行查找,最后会在内建(built-in)命名空间搜索(注:如果一个名称在所有命名空间中都没有找到,就会产生一个NameError)。

  • 相关阅读:
    POJ
    POJ
    HDU——1027Ignatius and the Princess II(next_permutation函数)
    HDU——1106排序(istringstream的使用、STLvector练习)
    HDU——2054A==B?
    HDU——2087剪花布条
    HDU——2064汉诺塔III
    HDU——2068RPG的错排(错排公式)
    HDU——1789Doing Homework again(贪心)
    HDU——2067小兔的棋盘(卡特兰数&递推DP)
  • 原文地址:https://www.cnblogs.com/windyrainy/p/10659427.html
Copyright © 2011-2022 走看看