精华内容
下载资源
问答
  • LEGB规则

    2020-10-28 15:15:27
    LEGB规则 Python 在查找"名称"时,是按照 LEGB 规则查找的: Local–>Enclosed–>Global–>Built in Local 指的就是函数或者类的方法内部 Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包) ...

    LEGB规则

    Python 在查找"名称"时,是按照 LEGB 规则查找的:
    Local–>Enclosed–>Global–>Built in

    Local 指的就是函数或者类的方法内部
    Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)
    Global 指的是模块中的全局变量
    Built in 指的是 Python 为自己保留的特殊名称

    展开全文
  • LEGB 规则

    2018-05-18 16:21:47
    变量,作用域,命名...在Python中也一样,即LEGB。 Python 使用 LEGB 的顺序来查找一个符号对应的对象 locals -> enclosing function -> globals -> builtins locals,当前所在命名空...

    变量,作用域,命名空间 .etc
    在其他语言中,like C/C++ ,有全局变量,局部变量,以及各变量的作用范围,都有特定的规范。
    在Python中也一样,即LEGB

    Python 使用 LEGB 的顺序来查找一个符号对应的对象

    locals -> enclosing function -> globals -> builtins
    • locals,当前所在命名空间(如函数、模块),函数的参数也属于命名空间内的变量
    • enclosing,外部嵌套函数的命名空间(闭包中常见)
    def fun1():
      a = 10
      def fun2():
          # a 位于外部嵌套函数的命名空间
          print(a)
    • globals,全局变量,函数定义所在模块的命名空间
    a = 1
    def fun():
      # 需要通过 global 指令来声明全局变量
      global a
      # 修改全局变量,而不是创建一个新的 local 变量
      a = 2
    • builtins,内建模块的命名空间。
    Python 在启动的时候会自动为我们载入很多内建的函数、类,
      比如 dict,list,type,print,这些都位于 __builtin__ 模块中,
      可以使用 dir(__builtin__) 来查看。
      这也是为什么我们在没有 import任何模块的情况下,
      就能使用这么多丰富的函数和功能了。
    
      在Python中,有一个内建模块,该模块中有一些常用函数;在Python启动后,
      且没有执行程序员所写的任何代码前,Python会首先加载该内建函数到内存。
      另外,该内建模块中的功能可以直接使用,不用在其前添加内建模块前缀,
      其原因是对函数、变量、类等标识符的查找是按LEGB法则,其中B即代表内建模块
      比如:内建模块中有一个abs()函数,其功能求绝对值,如abs(-20)将返回20

    Conclusion:

    LEGB规则让我们在编程能够更加的规范跟方便。

    展开全文
  • PythonLEGB规则

    2019-03-26 18:11:45
    Python LEGB规则 之所以有这篇总结,是因为在当初学习及使用Python的过程中发现,理解Python的LEGB原则是理解Python命名空间的关键,而理解Python的命名空间又是理解Python中许多语法规定的关键。所以,Python的...

    Python LEGB规则



    之所以有这篇总结,是因为在当初学习及使用Python的过程中发现,理解Python的LEGB原则是理解Python命名空间的关键,而理解Python的命名空间又是理解Python中许多语法规定的关键。所以,Python的LEGB原则就成为Python中一个非常核心的内容,因而,也就有了本篇。

    1. 命名空间

    先来一段概要总结:

    白话一点讲:命名空间是对变量名的分组划分
    不同组的相同名称的变量视为两个独立的变量,因此隶属于不同分组(即命名空间)的变量名可以重复。
    命名空间可以存在多个,使用命名空间,表示在该命名空间中查找当前名称。

    虽然命名空间是一个跟具体语言无关的概念,但是,不同的语言由于机制不同,因此在表现上还是有差别的。例如下述Python的例子:

    x = 10
    def foo():
        global x
        x += 1
        print x
    

    在这个例子中,使用函数外部的变量x之前需要使用global关键字。这在C++中是不需要的。
    所以,在理解Python的命名空间时,不能C++的规则来套,因为语法规则属于机制的实现。
    那么,如何理解Python的命名空间呢?

    C语言中,存在命名空间的概念,但是并没有提供对命名空间的支持,因此,在编写C程序的过程中,很容易发生名称碰撞(name collision),而避免这一问题,基本靠程序员自身来完成。为了解决这个问题C++中提供了namespace关键字支持。
    根据我的经验,理解Python的命名空间,从变量入手是个不错的选择。
    C语言中,变量名是内存地址的别名。但是由于Python一切皆对象,所以在Python中变量名是字符串对象
    例如:

    >>> a = 10
    

    表示建立字符串对象aNumber对象10之间的对应关系。由于这是一种映射关系,所以,可以使用键-值的形式来表示,即**{name : object}
    前面已经说过,命名空间是对变量名的分组划分,所以,Python的命名空间就是对许多
    键-值**对的分组划分,即,键值对的集合,因此:

    Python的命名空间是一个字典,字典内保存了变量名称与对象之间的映射关系

    好了,到这里,终于可以引入本篇的重点LEGB,呼~

    2. LEGB

    LEGB含义解释:
    L-Local(function);函数内的名字空间
    E-Enclosing function locals;外部嵌套函数的名字空间(例如closure)
    G-Global(module);函数定义所在模块(文件)的名字空间
    B-Builtin(Python);Python内置模块的名字空间

    前面讲到,Python的命名空间是一个字典,字典内保存了变量名称与对象之间的映射关系,因此,查找变量名就是在命名空间字典中查找键-值对
    Python有多个命名空间,因此,需要有规则来规定,按照怎样的顺序来查找命名空间,LEGB就是用来规定命名空间查找顺序的规则

    LEGB规定了查找一个名称的顺序为:local–>enclosing function locals–>global–>builtin

    举个栗子来说明:

    #!/usr/bin/env python
    # encoding: utf-8
    
    x = 1 
    
    def foo():
        x = 2 
        def innerfoo():
            x = 3 
            print 'locals ', x
        innerfoo()
        print 'enclosing function locals ', x
    
    foo()
    print 'global ', x
    

    运行结果:

    locals  3
    enclosing function locals  2
    global  1
    

    对上例稍加改动

    #!/usr/bin/env python
    # encoding: utf-8
    
    x = 1 
    
    def foo():
        x = 2 
        def innerfoo():
        #    x = 3                  #此处改动:注释掉
            print 'locals ', x
        innerfoo()
        print 'enclosing function locals ', x
    
    foo()
    print 'global ', x
    

    运行结果

    locals  2
    enclosing function locals  2
    global  1
    

    可以发现:当注释掉x = 3以后,函数innerfoo内部查找到的xx = 2

    在上述两个例子中,从内到外,依次形成四个命名空间:
    def innerfoo()::Local, 即函数内部命名空间;
    def foo()::Enclosing function locals;外部嵌套函数的名字空间
    module(文件本身):Global(module);函数定义所在模块(文件)的名字空间
    Python内置模块的名字空间:Builtin

    x = 3 属于函数内部命名空间,当被注释掉之后,函数innerfoo内部通过print x 使用x这个名称时,触发了名称查找动作。
    首先在Local命名空间查找,没有找到,然后到Enclosing function locals命名空间查找,查找成功,然后调用。

    写在最后
    通过上面的分析可以发现,Python在确定一个变量的核心规则是LEGB,只有熟悉LEGB规则,才能清楚在程序执行过程中调用的变量究竟是什么。

    展开全文
  • 74.LEGB规则 Python在查找“名称”时,是按照LEGB规则查找的: Local-->Enclosed-->Global-->Built in Local 指的就是函数或者类的方法内部 Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包) ...

    74.LEGB规则


    术语对照表- 命名空间 namespace


    Python在查找“名称”时,是按照LEGB规则查找的:
    Local-->Enclosed-->Global-->Built in

    • Local 指的就是函数或者类的方法内部
    • Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)
    • Global 指的是模块中的全局变量
    • Built in 指的是Python为自己保留的特殊名称。

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

    代码测试

    def outer():
        str = 'outer'
    
        def inner():
            str = "inner"
            print(str)
        inner()
    
    
    # 同样都有 str   优先使用   更内部的
    
    # 把innner  里面的 str  注释掉  ,那么  打印出来的 就是 outer 的 str
    
    # 如果内部外部 都没有 str   那么 使用的是 python 的内置 函数  是个关键字
    outer()
    
    
    In [2]: outer
    Out[2]: <function __main__.outer()>
    
    In [3]: outer()
    inner
    
    展开全文
  • nonlocal关键字和LEGB规则nonlocal关键字LEGB规则 nonlocal关键字 nonlocal 用来声明外层的局部变量。 global 用来声明全局变量。 #测试nonlocal、global关键字的用法 a = 100 def outer(): b = 10 def inner():...
  • python学习 LEGB规则

    2018-10-21 13:50:59
    LEGB规则 python使用LEGB规则查找一个符号对应的对象 locals -&gt; enclosing function -&gt; globals -&gt; builtins locals,当前所在的命名空间(如函数,模块),函数的参数也属于命名空间内的变量 ...
  • Python 命名空间和LEGB规则

    千次阅读 2016-07-28 16:53:09
    Python LEGB规则 命名空间
  • Python中的变量作用域,LEGB规则和闭包原理.pdf
  • 20201025_085.LEGB规则

    2020-11-30 07:36:43
    LEGB 规则 Python 在查找变量时,是按照 LEGB 规则的顺序查找的: Local–>Enclosed–>Global–>Built in Local 指的就是函数或者类的方法内部 Enclosed 函数所在闭包的外层函数中(一个函数包裹另一个函数...
  • Python(二十一)—— LEGB规则 一、解释 Python在查找“名称”的时候,是按照LEGB规则查找的, Local–>Enclosed–>Global–>Buitl in。 Local:指的是函数或者类方法的内部。 Enclosed:指的是嵌套函数...
  • 69.Python中的LEGB规则详解
  • Python中的LEGB规则

    2020-05-18 06:22:51
    Python中的LEGB规则 目标 命名空间和作用域——Python从哪里查找变量名? 我们能否同时定义或使用多个对象的变量名? Python查找变量名时是按照什么顺序搜索不同的命名空间? 命名空间与作用域的介绍 命名空间 大约...
  • LEGB 规则 Python 使用 LEGB 的顺序来查找一个符号对应的对象 locals -&gt; enclosing function -&gt; globals -&gt; builtins locals,当前所在命名空间(如函数、模块),函数的参数也属于命名...
  • Python入门基础篇 No.64 —— nonlocal 关键字_LEGB 规则 文章目录Python入门基础篇 No.64 —— nonlocal 关键字_LEGB 规则前言一、nonlocal 关键字二、LEGB 规则总结 前生篇:嵌套函数_内部函数_数据隐藏 前言 ...
  • Python LEGB规则

    2019-01-02 15:34:00
    本篇总结了Python中的命名空间及LEGB原则 写在前面的话 之所以有这篇总结,是因为在当初学习及使用Python的过程中发现,理解Python的LEGB原则是理解Python命名空间的关键,而理解Python的命名空间又是理解Python...
  • LEGB规则 1.嵌套函数 嵌套函数就是在函数内部定义的函数 def f1(): print('abcd') def f2(): print('fguyrwe') f2() f1() 嵌套函数的作用: 封装------隐藏数据(外部无法访问嵌套函数) 贯彻DRY(don’t...
  • 本文是为了说明python 的命名空间和LEGB规则下变量的解析范围的一篇入门文章。下面的部分会提供一些简短的代码块及相关的说明和配图,你可以很方便的阅读这份入门手册,但我更推荐你能亲自运行下面的代码。 目的 ...
  • Day7:嵌套函数、LEGB规则,面向对象编程及类的初识 文章目录Day7:嵌套函数、LEGB规则,面向对象编程及类的初识嵌套函数一般在什么情况下使用嵌套函数?nonlocal关键字LEGB原则面向对象编程面向对象和面向过程的...
  • 命名空间与LEGB规则  之前隐隐约约提到过一些关于Python赋值语句的特殊性的问题,这个问题的根源就在于Python中的变量的命名空间机制和之前熟悉的C也好java也好都不太一样。 ■ 命名空间  所谓命名空间,就是...
  • Python之LEGB规则

    2019-10-28 21:34:01
    Local–Enclosed–Global–Builtin 经过这些顺序查找,如果还没有找到,就会报错 Local 指的就是函数或者类的方法内部 Enclosed 指的是嵌套函数(一个函数包裹另一...# 测试LEGB str = "global str" def outer(): ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,723
精华内容 689
关键字:

LEGB规则