zoukankan      html  css  js  c++  java
  • Python中的命名空间概念

    python使用命名空间记录变量。python中的命名空间就像是一个dict,key是变量的名字,value是变量的值。

    python中,每个函数都有一个自己的命名空间,叫做local namespace,它记录了函数的变量。
    python中,每个module有一个自己的命名空间,叫做global namespace,它记录了module的变量,包括 functions, classes 和其它imported modules,还有 module级别的 变量和常量。
    还有一个build-in 命名空间,可以被任意模块访问,这个build-in命名空间中包含了build-in function 和 exceptions。

    当python中的某段代码要访问一个变量x时,python会在所有的命名空间中寻找这个变量,查找的顺序为:

    local namespace - 指的是当前函数或者当前类方法。如果在当前函数中找到了变量,停止搜索
    global namespace - 指的是当前的模块。如果在当前模块中找到了变量,停止搜索
    build-in namespace - 如果在之前两个namespace中都找不到变量x,python会假设x是build-in的函数或者变量。如果x不是内置函数或者变量,python会报错NameError。

    对于闭包来说,这里有一点区别,如果在local namespace中找不到变量的话,还会去父函数的local namespace中找变量。
     
    locals
    内置函数locals(), 返回当前函数(方法)的局部命名空间
     
    def func(a = 1):
        b = 2
        print(locals())
        return a+b
    func()
    # {'a': 1, 'b': 2} 可以看出,locals返回的是个dict123456
    

      

    globals
    内置函数globals(),返回当前module的命名空间
     
    def func(a = 1):
        b = 2
        return a+b
    func()
    print(globals()) # globals()返回的也是个dict12345
    

      

     
    locals()和globals()有一个区别是,locals只读,globals可以写
     
    def func(a = 1):
        b = 2
        return a+b
    func()
    glos = globals()
    glos['new_variable'] = 3
    print(new_variable)
    # 3  , 我们并没有显示定义new_variable这个变量,只是在globals中添加了这个key,在随后的代码中,
    #就可以像访问一般变量一样来访问。
    def func(a = 1):
        b = 2
        locs = locals()
        locs['c']  = 1
        print(c)
    func()
    # NameError: name 'c' is not defined1234567891011121314151617
    

      

    from module import 和 import module

    使用import module时,module本身被引入,但是保存它原有的命名空间,所以我们需要使用module.name这种方式访问它的 函数和变量。
    from module import这种方式,是将其它模块的函数或者变量引到当前的命名空间中,所以就不需要使用module.name这种方式访问其它的模块的方法了。
     

    if __name__ trick
    python中的module也是对象,所有的modules都有一个内置的属性__name__,模块的__name__属性的值取决于如何使用这个模块,如果import module,那么__name__属性的值是模块的名字。如果直接执行这个模块的话,那么__name__属性的值就是默认值__main__。
     
    module的一些内置属性

    __name__: 上面已经介绍过
    __file__ : 当前module的绝对路径
    __dict__:
    __doc__ :
    __package__:
    __path__:
  • 相关阅读:
    【Android N 7.1.1】 屏幕亮和灭的处理地方
    Android 测量调用方法耗时的方法
    【Android M】获取屏幕锁定的相关信息:“无”,“滑动”,“PIN码”,"图案","密码"
    【Android N 7.1.1】 ActivityManagerService 获取cpu状态
    Android 判断当前是否在跑monkey测试
    【Android N 7.1.1】 锁屏之上显示Toast
    【Android N 7.1.1】 处于锁屏界面时可以转屏
    【Android N 7】使用量统计usagestats
    #### 批处理命令 获取当前目录下所有文件的路径
    Linux命令 swap:内存交换空间
  • 原文地址:https://www.cnblogs.com/zoneofmine/p/10531291.html
Copyright © 2011-2022 走看看