精华内容
下载资源
问答
  • python 命名空间

    2015-01-26 21:28:37
    python命名空间与作用域 命名空间是名称与对象之间的关系,可以将命名空间看做是字典,其中的键是名称,值是对象。 命名空间不共享名称。 在命名空间中的名称能将任何python对象作为值,在不同的命名空间中相同的...

    Python命名空间的本质

    Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。

    接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间的查找顺序;三、命名空间的生命周期;四、通过locals()和globals() BIF访问命名空间

    重点是第四部分,我们将在此部分观察命名空间的内容。

    一、命名空间

    Python使用叫做命名空间的东西来记录变量的轨迹。命名空间是一个 字典(dictionary) ,它的键就是变量名,它的值就是那些变量的值。
    namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。
     
    在一个 Python 程序中的任何一个地方,都存在几个可用的命名空间。
         1、每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
         2、每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
         3、还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。
     
    二、命名空间查找顺序
    当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:
         1、局部命名空间:特指当前函数或类的方法。如果函数定义了一个局部变量 x,或一个参数 x,Python 将使用它,然后停止搜索。
         2、全局命名空间:特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
         3、内置命名空间:对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。
         4、如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name 'aa' is not defined
     
    嵌套函数的情况:
         1、先在当前 (嵌套的或 lambda) 函数的命名空间中搜索
         2、然后是在父函数的命名空间中搜索
         3、接着是模块命名空间中搜索
         4、最后在内置命名空间中搜索
     
    示例:
    复制代码
     1 info = "Adress : "
     2 def func_father(country):
     3     def func_son(area):
     4         city= "Shanghai " #此处的city变量,覆盖了父函数的city变量
     5         print(info + country + city + area)
     6     city = " Beijing "
     7     #调用内部函数
     8     func_son("ChaoYang ");
     9  
    10 func_father("China ")
    复制代码

    输出:Adress : China Shanghai ChaoYang

    以上示例中,info在全局命名空间中,country在父函数的命名空间中,city、area在自己函数的命名空间中
     
     
    三、命名空间的生命周期
    不同的命名空间在不同的时刻创建,有不同的生存期。
         1、内置命名空间在 Python 解释器启动时创建,会一直保留,不被删除。
         2、模块的全局命名空间在模块定义被读入时创建,通常模块命名空间也会一直保存到解释器退出。
         3、当函数被调用时创建一个局部命名空间,当函数返回结果 或 抛出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。
     
      Python 的一个特别之处在于其赋值操作总是在最里层的作用域。赋值不会复制数据——只是将命名绑定到对象。删除也是如此:"del y" 只是从局部作用域的命名空间中删除命名 y 。事实上,所有引入新命名的操作都作用于局部作用域。
    示例:
    i=1
    def func2():
        i=i+1
     
    func2();
    #错误:UnboundLocalError: local variable 'i' referenced before assignment

    由于创建命名空间时,python会检查代码并填充局部命名空间。在python运行那行代码之前,就发现了对i的赋值,并把它添加到局部命名空间中。当函数执行时,python解释器认为i在局部命名空间中但没有值,所以会产生错误。

    复制代码
    def func3():
      y=123
      del y
      print(y)
    
    func3()
    #错误:UnboundLocalError: local variable 'y' referenced before assignment
    #去掉"del y"语句后,运行正常
    复制代码

     

    四、命名空间的访问

    1、局部命名空间可以 locals()  BIF来访问。
    locals 返回一个名字/值对的 dictionary。这个 dictionary 的键是字符串形式的变量名字,dictionary 的值是变量的实际值。
    示例:
    def func1(i, str ):
        x = 12345
        print(locals())
     
    func1(1 , "first")

    输出:{'str': 'first', 'x': 12345, 'i': 1}

     
    2、全局 (模块级别)命名空间可以通过 globals() BIF来访问。
    示例:
    复制代码
    '''Created on 2013-5-26'''
     
    import copy
    from copy import deepcopy
     
    gstr = "global string"
     
    def func1(i, info):
        x = 12345
        print(locals())
     
    func1(1 , "first")
     
    if __name__ == "__main__":
        print("the current scope's global variables:")
        dictionary=globals()
        print(dictionary)
    复制代码

    输出:(我自己给人为的换行、更换了顺序,加颜色的语句下面重点说明)

    {
    '__name__': '__main__',
    '__doc__': 'Created on 2013-5-26',  
    '__package__': None, 
    '__cached__': None, 
    '__file__': 'E:\\WorkspaceP\\Test1\\src\\base\\test1.py', 
    '__loader__': <_frozen_importlib.SourceFileLoader object at 0x01C702D0>, 
    'copy': <module 'copy' from 'D:\\Python33\\lib\\copy.py'>, 
    '__builtins__': <module 'builtins' (built-in)>, 
    'gstr': 'global string', 
    'dictionary': {...}, 
    'func1': <function func1 at 0x01C6C540>, 
    'deepcopy': <function deepcopy at 0x01DB28A0>
    }
     
    总结
      1、模块的名字空间不仅仅包含模块级的变量和常量,还包括所有在模块中定义的函数和类。除此以外,它还包括了任何被导入到模块中的东西。
      2、我们看到,内置命名也同样被包含在一个模块中,它被称作 __builtin__。
      3、回想一下 from module import 和 import module 之间的不同。
        使用 import module,模块自身被导入,但是它保持着自已的名字空间,这就是为什么您需要使用模块名来访问它的函数或属性:module.function 的原因。
        但是使用 from module import function,实际上是从另一个模块中将指定的函数和属性导入到您自己的名字空间,这就是为什么您可以直接访问它们却不需要引用它们所来源的模块。使用 globals 函数,您会真切地看到这一切的发生,见上面的红色输出语句。
     
    3、 locals 与 globals 之间的一个重要的区别
    locals 是只读的,globals 不是
    示例:
    复制代码
    def func1(i, info):
        x = 12345
        print(locals())
        locals()["x"]= 6789
        print("x=",x)
     
    y=54321
    func1(1 , "first")
    globals()["y"]= 9876
    print( "y=",y)
    复制代码

    输出:

    {'i': 1, 'x': 12345, 'info': 'first'}
    x= 12345
    y= 9876
    解释:
      locals 实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行改变对局部名字空间中的变量值并无影响。
      globals 返回实际的全局名字空间,而不是一个拷贝。所以对 globals 所返回的 dictionary 的任何的改动都会直接影响到全局变量。
    展开全文
  • python命名空间

    千次阅读 2020-02-28 09:08:02
    内置命名空间 —— python解释器 就是python解释器一启动就可以使用的名字存储在内置命名空间中 内置的名字在启动解释器的时候被加载进内存里 全局命名空间 —— 我们写的代码但不是函数中的代码 是在程序从上到下被...

    原文地址

    命名空间 有三种
    内置命名空间 —— python解释器
    就是python解释器一启动就可以使用的名字存储在内置命名空间中
    内置的名字在启动解释器的时候被加载进内存里
    全局命名空间 —— 我们写的代码但不是函数中的代码
    是在程序从上到下被执行的过程中依次加载进内存的
    放置了我们设置的所有变量名和函数名
    局部命名空间 —— 函数
    就是函数内部定义的名字
    当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了

    在局部:可以使用全局、内置命名空间中的名字
    在全局:可以使用内置命名空间中的名字,但是不能用局部中使用
    在内置:不能使用局部和全局的名字的

    展开全文
  • Python 命名空间

    2015-02-26 17:27:19
    通俗的来说,Python中所谓的命名空间可以理解为一个容器。在这个容器中可以装许多标识符。不同容器中的同名的标识符是不会相互冲突的。理解python命名空间需要掌握三条规则: 第一,赋值(包括显式赋值和隐式赋值...

    转自:http://www.jb51.net/article/53906.htm

    通俗的来说,Python中所谓的命名空间可以理解为一个容器。在这个容器中可以装许多标识符。不同容器中的同名的标识符是不会相互冲突的。理解python的命名空间需要掌握三条规则:

    第一,赋值(包括显式赋值和隐式赋值)产生标识符,赋值的地点决定标识符所处的命名空间

    第二,函数定义(包括def和lambda)产生新的命名空间

    第三,python搜索一个标识符的顺序是"LEGB"。

    所谓的"LEGB"是python中四层命名空间的英文名字首字母的缩写。
    最里面的一层是L(local),表示在一个函数定义中,而且在这个函数里面没有再包含函数的定义。
    第二层E(enclosing function),表示在一个函数定义中,但这个函数里面还包含有函数的定义,其实L层和E层只是相对的。
    第三层G(global),是指一个模块的命名空间,也就是说在一个.py文件中定义的标识符,但不在一个函数中。
    第四层B(builtin),是指python解释器启动时就已经具有的命名空间,之所以叫builtin是因为在python解释器启动时会自动载入__builtin__模块,这个模块中的list、str等内置函数的就处于B层的命名空间中。

    这三条规则通过一个例子来看比较明白。如下面例子所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> g = int('0x3', 0)
    >>> def outFunc():
      e = 2
        g = 10
      def inFunc():
         l = 1
         return g + e
        return inFunc()
    >>> outFunc() ===> 12

    来详细看看这段代码中的标识符。
    第1行,适用第一条规则“赋值产生标识符”,因此产生一个标识符g。“赋值的地点决定标识符所处的命名空间”,因为g是没有在一个函数定义中,因此g处于'G'层命名空间中。这一行中还有一个标识符,那就是int。那么int是在什么地方定义的呢?由于int是内置函数,是在__builtin__模块中定义的,所以int就处于'B'的层命名空间中。
    第2行,适用第一条规则,由于def中包含一个隐性的赋值过程,这一行产生一个标识符outFunc,outFunc并不处于一个函数定义的内部,因此,outFunc处于'G'层命名空间中。此外,这一行还适用第二条规则,产生一个新的命名空间。
    第3行,适用第一条规则,产生个标识符e,而且由于这是在一个函数定义内,并且内部还有函数定义,因此e处于'E'层命名空间中。
    第4行要注意,适用第一条规则,产生一个标识符g,这个g与e一样外于'E'层命名空间中。这个g与第一行的g是不同的,因为所处的命名空间不一样。
    第5行,适用第一条规则,产生一个处于'E'层命名空间的标识符inFunc。与第2行一样,这一行定义函数也产生一个新的命名空间。
    第6行,适用第一条规则,产生一个标识符l,由于这个l处于一个函数内部,而且在这个函数内部没有其他函数的定义,因此l处于'L'层命名空间中。
    第7行,适用第三条规则,python解释器首先看到标识符g,按照LEGB的顺序往上找,先找L层(也就是在inFunc内部),没有。再找E层,有,值为10。因此这里的g的值为10。寻找过程到为止,并不会再往上找到'G'层。寻找e的过程也一样,e的值为2。因此第9行的结果为12。

    其实,所谓的“LEGB”是为了学术上便于表述而创造的。让一个编程的人说出哪个标识符处于哪个层没有什么意义,只要知道对于一个标识符,python是怎么寻找它的值的就可以了。其实找值的过程直观上也很容易理解。

    通过上面的例子也可以看出,如果在不同的命名空间中定义了相同的标识符是没有关系的,并不会产生冲突。寻找一个标识符的值过程总是从当前层开始往上找的,首先找到的就为这个标识符的值。也由此可以这么说,'B'层标识符在所有模块(.py文件)中可用;'G'层标识符在当前模块内(.py文件)中可用;'E'和'L'层标识符在当前函数内可用。

    再来看一个例子,来解释global语句的用法。代码如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> g = 'global'
    >>> s = 'in'
    >>> def out():
        g = 'out'
        def inter():
         global g     
         print s,g
      inter()
    >>> out() ===> 'in global'

    可以看到,虽然有两个层中的g,但使用了global语句后,就是指'G'层的标识符。也就是第7行中的g,就是指第1行产生的那个g,值为'global'。

    最后说一句,其实只要在编程的时候注意一下,不要使用相同的标识符,基本上就可以避免任何与命名空间相关的问题。还有就是在一个函数中尽量不要使用上层命名空间中的标识符,如果一定要用,也最好使用参数传递的方式进行,这样有利于保持函数的独立性。



    展开全文
  • 主要介绍了python命名空间(namespace)简单介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。 命名空间: Python使用叫做命名空间的东西来记录变量的轨迹。命名空间是一个 字典...

    在这里插入图片描述

    Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。

    命名空间:
    Python使用叫做命名空间的东西来记录变量的轨迹。命名空间是一个 字典(dictionary) ,它的键就是变量名,它的值就是那些变量的值。
    A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。

    在一个 Python 程序中的任何一个地方,都存在几个可用的命名空间。
    1、每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
    2、每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
    3、还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。
    2、Python使用叫做命名空间的东西来记录变量的轨迹。命名空间是一个 字典(dictionary) ,它的键就是变量名,它的值就是那些变量的值。
    A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。

    在一个 Python 程序中的任何一个地方,都存在几个可用的命名空间。
    1、每个函数都有着自已的命名空间,叫做局部命名空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
    2、每个模块拥有它自已的命名空间,叫做全局命名空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
    3、还有就是内置命名空间,任何模块均可访问它,它存放着内置的函数和异常。

    以上就是关于Python命名空间的相关介绍了,希望能够给大家带来帮助。
    文章部分内容源于网络,联系侵删*
    文章转自:http://http.taiyangruanjian.com/news/94725.html

    展开全文
  • Python命名空间的本质

    2017-11-15 15:38:26
    Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则。 接下来我将分四部分揭示Python命名空间的本质:一、命名空间的定义;二、命名空间的...
  • 精简解答python命名空间和作用域 文章目录精简解答python命名空间和作用域1.命名空间2.变量在命名空间的存在形式3.命名空间查找顺序4.命名空间的生命周期5.命名空间的实例 1.命名空间 简单来说,命名空间就是变量的...
  • Python 命名空间详解

    2019-01-15 14:29:00
    微信公众号 Fluent Python 技术讨论 QQ 群 894163155 前言:最近在写一个程序的时候需要用到一个全局共享的变量。最初使用的时候,我的思路如下,把全局变量定义在当前模块当中, # @Author : stefanlei # @File : ...
  • Python3 命名空间和作用域 命名空间 先看看官方文档的一段话: A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。 命名空间(Namespace)是...
  • Python 命名空间和LEGB规则

    千次阅读 2016-07-28 16:53:09
    Python LEGB规则 命名空间
  • 一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。 每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。 Python...
  • Python使用叫做命名空间的东西来记录变量的轨迹。命名空间是一个字典它的键就是变量名,它的值就是那些变量的值。 在一个 Python 程序中的任何一个地方,都存在几个可用的命名空间。  1、每个函数都有着自已的命名...
  • 命名空间python中无处不在,简直屌到爆炸:全局,内建&lt;builtins&gt;,如果有函数执行则有局部命名空间, 对象命名空间(包含了class类对象,实例对象,模块对象...),都有命名空间.命名空间就是变量到对象的...
  • Python中的命名空间,在使用点号 .和不使用点号 .两种情况下使用变量名时,会有不同的处理方式。 1.不使用点号——“LEGB法则” 赋值语句 var=value 仅仅是创建或改变当前作用域变量名,除非使用了global或者...
  • Python命名空间namespace

    千次阅读 2017-04-06 16:18:34
    # outer_arg为Enclosing封闭的命名空间中的变量。 # 当引用某个变量outer_arg的名字时 # 根据LEGB-rule, local->enclosing->global->built-in。 # 此时inner_func()的local中找到outer_arg # 向外层的...
  • Python使用叫做命名空间的东西来记录变量的轨迹。命名空间只是一个 字典,它的键字就是变量名,字典的值就是那些变量的值。实际上,命名空间可以象Python的字典一样进行访问,一会我们就会看到。在一个Python程序中...
  • 模块的命名空间实际上是以字典的形式实现的,并且可以由内置属性__dict__显示这一点,类和实例对象也是如此:属性点号运算其实内部就是字典的索引运算,而属性继承其实就是搜索联结的字典而已,实例和类对象都是...
  • Python命名空间和作用域窥探

    千次阅读 2016-09-20 17:59:33
    Namespace and Scope(命名空间和作用域) namespace Namespace(只)是 从名字到对象的一个映射(a mapping from name to objects) 。大部分namespace都是按Python中的字典来实现的。有一些常见的...
  • 第六章 补充知识:命名空间和作用域。 2018-12-30 15:36:56 用例题来弄清楚这两个概念 文章目录第六章 补充知识:命名空间和作用域。1.引入:阅读以下代码,思考输出结果的原因。2.阅读以下代码的输出结果,思考当...
  • 点号的属性名使用的是对象的命名空间 有些作用域会对对象的命名空间进行初始化(模块和类) 简单变量名:如果赋值就不是全局变量 无点号的简单变量名遵循函数的LEGB作用域法则 具体如下啊: 赋值语句(X=value):...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,516
精华内容 34,606
关键字:

python命名空间

python 订阅