前言

命名空间通俗的理解就是对象或变量的作用范围,在python中分为局部命令空间、模块命名空间和build-in全局命名空间。

局部命名空间

局部命名空间即在一个函数或一个类中起作用的变量或引用的字典集合,使用local()即可获得局部的命名空间,是一个字典。

class Person(object):
name = 'cai'
print(locals()) # {'__module__': '__main__', '__qualname__': 'Person', 'name': 'cai'}
locals()['age'] = 20
print(locals()) # {'__module__': '__main__', '__qualname__': 'Person', 'name': 'cai', 'age': 20}
def get_name(self):
print(locals()) # {'self': <__main__.Person object at 0x0000026BF6E35358>}
print(locals()) # {'__module__': '__main__', '__qualname__': 'Person', 'name': 'cai', 'age': 20, 'get_name': <function Person.get_name at 0x0000026BF6B74598>}
if __name__ == "__main__":
Person().get_name()
  • 所有在类或函数中定义或引用的对象会被收集到该类或函数的局部命名空间中;

  • local()方法会获取当前所处位置的局部命名空间,可以手动往局部命名空间中添加键值对;

  • python作为解释型语言,代码上下文从上往下加载,其实就是不断往命名空间中添加对象的键值对;

模块命名空间

模块命名空间即在当前模块中的所有的对象的字典集合,使用globals()获取模块命名空间。

from test import name
import os
class Person(object):
pass if __name__ == "__main__":
print(globals())
print(locals())
  • 如果是在模块中直接使用globals()和locals()获取命名空间,它们得到的结果是一模一样的;

  • 模块命名空间收集了所有隐藏属性、定义的对象或导入的模块或对象的字典集合;

  • 从某个模块中导入一个对象,本质就是将该对象的键值对加入到模块的命名空间中,同理直接导入某个模块,就是将整个模块的命名空间导入到另一个模块。

全局命名空间

除了局部命名空间和模块命名空间外,还有一种就是全局命名空间了,全局命名空间中的对象在任何模块无需导入就可以直接使用,其本质上是python的builtins模块的命名空间。

l = list()
d = dict()

如list、dict等方法无需导入即可使用,原因是每个py模块有一个隐藏的属性_builtins_,该属性指向全局的命名空间所在的模块,相当于每次都自动加载了builtins模块的命名空间。

修改命名空间

程序的运行逻辑一般在方法或函数中,它们默认使用的局部命名空间,如果想要在函数中修改模块命名空间就需要将模块命名空间引入到局部命名空间中。

name = 'xiao'
def get():
x = 1
def name():
global name
nonlocal x
print(locals()) # {'x': 1}
x = 2
print(locals()) # {'x': 2}
name = 'cao'
return name
if __name__ == "__main__":
get()()
print(globals()) # {....,'name': 'cao', 'get': <function get at 0x0000029E49AB2EA0>}
  • 通过global关键字可以将模块的命名空间中的变量引入到局部命名空间;nonlocal可以在闭包中将外层函数的命名空间引入到内层。

  • 注意nonlocal关键字是不能在方法中将类的属性等引入到方法中进行修改的。

总结

  • 全局命名空间在所有模块中可用,python自动加载,无需导入;

  • 模块命名空间收集本模块所有的对象的键值对,所有模块层面代码执行时会从模块命名空间查找对象;

  • 所有函数或方法中变量都只存在于局部命名空间,这使得各函数变量相互隔离。

参考

python基础之命名空间的更多相关文章

  1. 九. Python基础(9)--命名空间, 作用域

    九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...

  2. Python基础-作用域和命名空间(Scope and Namespace)

    在Python中,对象是独立的,不同作用域中的不同名字都可以被绑定在同一个对象上,当然对这个对象的修改会影响所有的引用.赋值操作就是名字和对象的绑定或重绑定.这和C++中的引用是一样的. 1,基础概念 ...

  3. python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)

    python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...

  4. Python基础教程【读书笔记】 - 2016/7/7

    希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第四波:第5章  条件.循环和其他语句 [总览]  深入介绍条件语句和循环语句,随后会看到列表推导式如何扮演循环和条件语 ...

  5. Python基础教程【读书笔记】 - 2016/7/4

    希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第二波:第7章  更加抽象 [总览] 创建自己的对象,是Python的核心概念!Python被称为面向对象的语言.介绍如 ...

  6. Python基础教程【读书笔记】 - 2016/6/26

    希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第一波:第6章  抽象 [总览] 介绍函数.参数parameter.作用于scope概念,以及递归概念. [6.1] 函 ...

  7. Python基础-类

    Python基础-类 @(Python)[python, python基础] 写在前面 如非特别说明,下文均基于Python3 摘要 本文重点讲述如何创建和使用Python类,绑定方法与非绑定方法的区 ...

  8. Python基础-类变量和实例变量

    Python基础-类变量和实例变量 写在前面 如非特别说明,下文均基于Python3 大纲: 1. 类变量和实例变量 在Python Tutorial中对于类变量和实例变量是这样描述的: Genera ...

  9. Python基础__函数

    本节将进入函数的介绍,函数是Python基础中最精彩的部分之一,接下来将对函数做详细介绍.函数 函数就是对代码进行一个封装.把实现某一功能的代码进行封装到一起.下次需要使用时不需要进行编写代码直接调用 ...

随机推荐

  1. 【bzoj4520】 Cqoi2016—K远点对

    http://www.lydsy.com/JudgeOnline/problem.php?id=4520 (题目链接) 题意 求平面内第K远点对的距离. Solution 左转题解:jump 细节 刚 ...

  2. 解题:CF983B pyramid

    题面 题目都告诉我们是“金字塔”了,不妨分析分析$f$的性质 $f(a_1,a_2)=f(a_1$ $xor$ $a_2)=a1$ $xor$ $a_2$ $f(a_1,a_2,a_3)=f(a_1$ ...

  3. bzoj 4521: [Cqoi2016]手机号码

    感觉get到了一种数位dp的新姿势,加一位表示当前要填的数有没有限制(感觉以前的写法都太蠢了). 这么写有两个地方要注意: 1.每dp到一位时需要f[i][初始状态]++,相当于这位前都是前导零(这道 ...

  4. bzoj3672【NOI2014】购票

    题目描述   今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.        全国的城市构成了一棵以SZ市为根的有根树,每个城市与 ...

  5. 自定义ribbon规则

    关于ribbon的知识:. 在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+restT ...

  6. linux命令总结之lsof命令

    简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控 ...

  7. 关于RESTful的理解

    如何更好的理解RESTful? (转自https://sanwen8.cn/p/54czrEO.html) 在测试开发中,我们经常接触到API,在调用API时候特别是第三方API时候,我们常常陷入以下 ...

  8. ElasticStack系列之十六 & ElasticSearch5.x index/create 和 update 源码分析

    开篇 在ElasticSearch 系列十四中提到的问题即 ElasticStack系列之十四 & ElasticSearch5.x bulk update 中重复 id 性能骤降,继续这个问 ...

  9. openstack组件的数据库操作

    一.基础 SQLAlchemy http://docs.sqlalchemy.org/en/rel_0_9/index.html 对数据库进行操作的工具:xxx-manage db ... 二.数据库 ...

  10. Python中的变量引用对象需注意的几点

    Python中的变量引用对象需注意的几点 分类:Python (55)  (0) 普通引用: Python中,变量的作用仅仅是一个标识,只有赋值后才被创建,它可以引用任何类型的对象,而且在引用之前必须 ...