前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python命名空间

python命名空间

作者头像
ke1th
发布2018-01-02 11:23:11
1.4K0
发布2018-01-02 11:23:11
举报

python的命名空间

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

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

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

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

对于闭包来说,这里有一点区别,如果在local namespace中找不到变量的话,还会去父函数的local namespace中找变量。

locals

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

代码语言:javascript
复制
def func(a = 1):
    b = 2
    print(locals())
    return a+b
func()
# {'a': 1, 'b': 2} 可以看出,locals返回的是个dict

globals

内置函数globals(),返回当前module的命名空间

代码语言:javascript
复制
def func(a = 1):
    b = 2
    return a+b
func()
print(globals()) # globals()返回的也是个dict

locals()和globals()有一个区别是,locals只读,globals可以写

代码语言:javascript
复制
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 defined

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__:
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • python的命名空间
    • locals
      • globals
        • from module import 和 import module
          • if __name__ trick
            • module的一些内置属性
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档