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__:

Python中的命名空间概念的更多相关文章

  1. python中变量命名的基本规则,标识符和关键字

    变量的命名 目标 标识符和关键字 变量的命名规则 0.1 标识符和关键字 1.1 标识符 标示符就是程序员定义的 变量名.函数名 名字 需要有 见名知义 的效果,见下图:  标示符可以由 字母.下划 ...

  2. python中的命名元组namedtuple

    namedtuple是继承自tuple的子类.namedtuple创建一个和tuple类似的对象,而且对象拥有可访问的属性 可利用collections.namedtuple构建一个简单的类. fro ...

  3. python中变量命名

    一 综述:  二 全局变量(包含函数和类): (1)正常变量x: *通过module.x能够使用. *通过from module import *能够使用. (2)以"_"开头变量 ...

  4. 详解 Python 中的下划线命名规则

    在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...

  5. Python中变量的命名

    变量的命名 目标 标识符和关键字 变量的命名规则 0.1 标识符和关键字 1.1 标识符 标示符就是程序员定义的 变量名.函数名 名字 需要有 见名知义 的效果,见下图: 标示符可以由 字母.下划线 ...

  6. Python中变量的命名与使用(个人总结)

    与众多编程语言一样,Python变量的命名有一定的规范: 变量名只能包含字母.数字.下划线且不能以数字开头.例如,num_1 为正确命名,而 1_num 则错误. 变量名不允许含空格,但是可以用下划线 ...

  7. vuex中module的命名空间概念

    vuex中module的命名空间概念 默认情况下,模块内部的 action.mutation 和 getter 是注册在全局命名空间的. 弊端1:不同模块中有相同命名的mutations.action ...

  8. 【Python基础】03_Python中的命名和关键字

    1.Python中的关键字: ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', ...

  9. Python中的变量以及变量的命名

    1.变量的定义 在 python 中,每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建 等号(=)用来给变量赋值 =左边是一个变量名 =右边是存储在变量中的值 变量名=值 变量定义之后,后续就 ...

随机推荐

  1. mysql-SELECT子句的顺序

  2. mpvue——Error: Cannot find module 'escape-string-regexp'

    报错 $ cnpm run build > mpvue-qq@1.0.0 build D:\wamp\www\wxsmallsoft\mini-0212\mpvueQQ > node bu ...

  3. Java 中数字和字符串拼接的问题

    注意细节 字符是char 类型,字符串是String 类型1.数字拼接char,得到的还是数字,相当于和它的ASCII编码相加(如果定义成String 会编译错误)2.数字拼接String,得到的是S ...

  4. 使用django执行数据更新命令时报错:django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.00 01_initial on database 'default'.

    如果在重新封装更新用户表之前,已经更新了数据表,在数据库中已经有了django相关的依赖表,就会报错: django.db.migrations.exceptions.InconsistentMigr ...

  5. 010-3 Socket协议ProtocolType

    ProtocolType成员 成员名称 说明 Ggp 网关到网关协议. Icmp Internet 控制消息协议. IcmpV6 IPv6 的 Internet 控制消息协议. Idp Interne ...

  6. python之路(7)装饰器

    前言 装饰器:为函数添加附属功能,本质为函数 原则:不修改被修饰函数的源代码 不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 使用场景演示 定义下面函数 def cal(l): res ...

  7. LINUX 常用命令(二)

    B0.用户相关配置文件 用户信息文件:        /etc/passwd密码文件:               /etc/shadow用户组文件:           /etc/group用户组密 ...

  8. Springboot 项目启动后执行某些自定义代码

    Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种"开机启动"某些方法的方式:ApplicationRunner和CommandLineRun ...

  9. 《B2C商城》电商平台搭建流程分析

    商城网站建设在当今互联网时代中是非常重要的.商城网站,是企业产品展示.品牌宣传与消费者互动交流的一个平台,利用好这样的一个平台,就能占得先机.那么问题来了,商城网站如何建设呢?这对于企业来说真的是一个 ...

  10. luogu P3810 三维偏序(陌上花开)cdq分治

    题目链接 思路 对一维排序后,使用$cdq$分治,以类似归并排序的方法处理的二维,对于满足$a[i].b \leq a[j].b$的点对,用树状数组维护$a[i].c$的数量.当遇到$a[i].b&g ...