• Python进阶01 命名空间


    一、命名空间是什么

    官方文档的一段话:

    A namespace is a mapping from names to objects. Most namespaces are currently implemented as Python dictionaries。

    命名空间是一个字典(dictionary),它的键就是变量名,它的值就是那些变量的值。命名空间的一大作用是避免名字冲突。

    个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

    二、Python的三种命名空间

    名称

    记录数据

    局部命名空间(Local namespace)

    记录了函数的参数和局部定义的变量。类中定义的也是。

    全局命名空间(Global namespace)

    记录了模块的变量,包括函数,类,其他导入的模块,模块级的变量和常量

    内置命名空间(Built-in namespace)

    Python 语言内置的名称,如存放内置的函数和类,例如:abs、char

    它们的空间范围如下图所示:

    三、命名空间的使用

    有一个名为vars的内置函数,它返回这个不可见的字典。

    >>> x = 1
    >>> scope = vars()
    >>> scope['x']
    1
    >>> scope['x'] += 1
    >>> x
    2

    那么有多少个命名空间呢?除全局作用域外,每个函数调用都将创建一个。

    内置函数 locals(),返回当前函数的局部命名空间

    x = 100
     
    def fun():
        a = 1
        b = 2
        print(locals())
        return a+b
     
    fun()
    结果:
    {'a': 1, 'b': 2}

    内置函数globals(),返回当前模块的全局命名空间

    x = 100
     
    def fun():
        a = 1
        b = 2
        print(locals())
        return a+b
     
    
    fun()
    print(globals())
    结果:
    {'a': 1, 'b': 2}
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x107d1f080>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Volumes/DATA/python/python_test/test.py', '__cached__': None, 'x': 100, 'fun': <function fun at 0x107cb3268>}

    四、命名空间的查找顺序

    当代码要使用变量x的值时,Python解释器回到所有可用的命名空间去查找变量,顺序:
    1、局部命名空间:当前函数或者类的方法。如果函数定义了一个局部变量x,解释器使用它,停止搜索。
    2、在父函数或嵌套的命名空间中搜索。
    3、全局命名空间,搜索当前的模块,如果模块定义了名为x的变量,函数,或者类,解释器使用它。
    4、内置命名空间:对每个模块都是全局的,作为最后的尝试,Python将假设x为内置函数或变量。
    5、如果 Python在这些名字空间找不到 x,它将放弃查找并引发一个 NameError 异常,如,NameError: name 'aa' is not defined。

    # 命名空间示例
    # var1 是全局名称 var1 = 5 def some_func(): # var2 是局部名称 var2 = 6 def some_inner_func(): # var3 是内嵌的局部名称 var3 = 7

    五、命名空间的生命周期

    1、内置命名空间,Python解释器启动时创建,退出时销毁
    2、全局命名空间,模块定义被解释器读入时创建,解释器退出时销毁
    3、局部命名空间,函数调用时创建,函数返回或者异常时销毁

    参考文章:

    https://www.cnblogs.com/goldsunshine/p/10948475.html

    https://www.runoob.com/python3/python3-namespace-scope.html

  • 相关阅读:
    System.Web.Http.Cors配置跨域访问的两种方式
    asp.net反向代理
    web.config SetAttributes
    remove name="ProxyModule“会导致重复执行
    去空格
    api签名
    C# HttpWebRequest获取COOKIES
    Request.Form接收不到post数据.
    webapi文档工具
    https://gogs.io/
  • 原文地址:https://www.cnblogs.com/mazhiyong/p/12515973.html
Copyright © 2020-2023  润新知