命名空间 Namespace

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

python使用命名空间记录变量的轨迹。python中有三个命名空间:

命名空间

名称

记录数据

函数的命名空间

局部命名空间

(local namespace)

记录了函数的参数和局部定义的变量

模块的命名空间

全局命名空间

(global namespace)

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

内置命名空间

内置命名空间

(build-in)

存放内置的函数和异常,例如:abs()

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

  1. x = 100
  2.  
  3. def fun():
  4. a = 1
  5. b = 2
  6. print locals()
  7. return a+b
  8.  
  9. fun()
  10. 结果:
  11. {'a': 1, 'b': 2}

  

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

  1. x = 100
  2.  
  3. def fun():
  4. a = 1
  5. b = 2
  6. print locals()
  7. return a+b
  8.  
  9. fun()
  10. print globals()
  11.  
  12. 结果:
  13. {'a': 1, 'b': 2}
    {'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'locals.py', '__package__': None, 'x': 100, 'fun': <function fun at 0x7fb18df93668>, '__name__': '__main__', '__doc__': None}

  

命名空间查找顺序

当代码要使用变量x的值时,Python解释器回到所有可用的命名空间去查找变量,顺序:

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

命名空间的生命周期

  1. 内置命名空间,python解释器启动时创建,退出时销毁
  2. 全局命名空间,模块定义被解释器读入时创建,解释器退出时销毁
  3. 局部命名空间,函数调用时创建,函数返回或者异常时销毁
  1. def fun():
  2. a = 1
  3.  
  4. fun()
  5. print a
  6.  
  7. Traceback (most recent call last):
  8. File "find_namespce.py", line 6, in <module>
  9. print a
  10. NameError: name 'a' is not defined

  

作用域

作用域针对变量而言,指申明了变量在程序里的可应用范围。只有函数,类,模块会产生作用域,代码块不会产生作用域。例如for循环,if判断都不产生作用域。

作用域可以划分成4类:

  1. 局部作用域
  2. 嵌套作用域
  3. 全局作用域
  4. 内建作用域

作用域链

python中作用域链,变量会由内到外去找,先去自己的作用域找,自己没有在去上级去找,一直到找不到报错。

特性:

函数未执行之前,作用域已经形成,作用域链也生成了

  1. name = "lzl"
  2.  
  3. def f1():
  4. print(name)
  5.  
  6. def f2():
  7. name = "eric"
  8. f1()
  9. f2()

  

这里有解释

#在f2中执行f1时,f1的作用域链已经形成,向上级找,name为lzl。

全局变量和局部变量

全局变量:所有函数之外定义的变量

局部变量:函数内部定义的变量 或者类,模块里的变量

全局变量和局部变量使用:

函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义了一个局部变量,不管全局域中有没有该变量名,函数中使用的将是局部变量。

(即声明了一个新的局部变量。如果这个变量名字和全部变量名字相同,那么局部变量名字会覆盖全局变量名字。)

  1. b = 2
  2.  
  3. def fun():
  4.  
  5. a = 1
  6. b = 10
  7. print locals()
  8. print a
  9. print b
  10.  
  11. fun()
  12. print globals()
  13.  
  14. {'a': 1, 'b': 10}
  15. 1
  16. 10
  17. {'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'find_namespce.py', '__package__': None, 'fun': <function fun at 0x7fb7bda1d668>, '__name__': '__main__', '__doc__': None}

  

局部变量如何使用全局变量:

[关键字 global]

  1. #[demo1]
  2.  
  3. Num = 100
  4. def func():
  5. global Num #声明这个Num是全局。如果全局变量已经有这个Num变量那就是指的它 如果全局没这个Num那就新定义一个全局变量。
  6. Num = 200 #凡是在函数内部Num始终是指全局变量。这里不可能有个局部变量叫Num的。
  7. print(Num )
  8.  
  9. func()
  10. print(Num ) #输出200 说明修改的就是全局变量啊

  

  1. #[demo2]
  2.  
  3. def func():
  4. global Num #声明这个Num是全局的哦。而且恰恰是此时没有一个全局变量是Num。那么如果全局没这个Num那就新定义一个Num的全局变量。
  5. Num = 200
  6. print(Num )
  7.  
  8. func()
  9. print(Num ) #输出200 说明新定义了一个全局变量Num

如果不是明显要局部变量和全局变量互相操作能不纠缠就不纠缠。也就是定义变量名字的时候 要严格规范。按照开发规范来定义名字。全局大写或者加上“_”开头,这是避免不必要问题的根本消灭问题。如果实在是场景需求 局部要操作修改赋值全局变量。那就使用global。

python进阶之命名空间与作用域的更多相关文章

  1. Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器

    Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: ​ 1. 可以在局部作用域声明一 ...

  2. Python进阶(二)----函数参数,作用域

    Python进阶(二)----函数参数,作用域 一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参 *args: ​ 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合 ...

  3. python开发函数进阶:命名空间,作用域,函数的本质,闭包,作用域方法(globales)

    一,命名空间 #局部命名空间#全局命名空间#内置命名空间 #三者的顺序#加载顺序       内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程 ...

  4. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  5. Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链

    命名空间 -------‘’存放名字与值的关系”的空间 代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间: 在函数的运行中开辟的临时的空间叫做局部命名空间. 命名空间一共分为三种: ...

  6. Python进阶 - 命名空间与作用域

    Python进阶 - 命名空间与作用域 写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字.对象及其绑定的文章. 1. 命名空 ...

  7. Python进阶-II 参数陷阱、命名空间、嵌套、作用域、闭包

    一.参数陷阱 在使用默认参数时,可能碰见下列情况 def show_args_trap(i, li = []): li.append(100) li[i] = 101 print(li) show_a ...

  8. 详解python命名空间和作用域

    1.典型案例 先从几个典型的案例来看下名称空间及作用域对python代码运行的影响,请看下面几个代码实例及其执行结果,是否符合你的预期. 代码1:块作用域 if True: i = 1 print i ...

  9. Python学习日记day10------函数的命名空间、作用域与闭合函数

    1,参数陷阱 如果默认参数的只是一个可变数据类型,那么每一次调用的时候,如果不传值就共用这个数据类型的资源. 2,三元运算 c=a if a>b else b#如果a>b返回a,否则,返回 ...

随机推荐

  1. Batchnorm原理详解

    Batchnorm原理详解 前言:Batchnorm是深度网络中经常用到的加速神经网络训练,加速收敛速度及稳定性的算法,可以说是目前深度网络必不可少的一部分. 本文旨在用通俗易懂的语言,对深度学习的常 ...

  2. php date获取前一天的时间

    结果: 结论: 第二种方式只使用了一个函数,所以更快一些,速度大约是第一种的两倍

  3. Python爬取6271家死亡公司数据,一眼看尽十年创业公司消亡史!

    ​ 小五利用python将其中的死亡公司数据爬取下来,借此来观察最近十年创业公司消亡史. 获取数据 F12,Network查看异步请求XHR,翻页. ​ 成功找到返回json格式数据的url, 很多人 ...

  4. 在Unity中使用自定义宏

    最近写AVG工具时有这样的功能需求,AVG的角色可以支持动态的Spine动画,当没有Spine动画时采用默认的立绘图片替代. 这时在脚本中就可以采用自定义的宏来实现: 例如: #if VNSpine ...

  5. Shell脚本中的while getopts用法小结

    getpots是Shell命令行参数解析工具,旨在从Shell Script的命令行当中解析参数.getopts被Shell程序用来分析位置参数,option包含需要被识别的选项字符,如果这里的字符后 ...

  6. 分词 | 双向匹配中文分词算法python实现

    本次实验内容是基于词典的双向匹配算法的中文分词算法的实现.使用正向和反向最大匹配算法对给定句子进行分词,对得到的结果进行比较,从而决定正确的分词方法. 算法描述正向最大匹配算法先设定扫描的窗口大小ma ...

  7. 训练DQN,报错:OSError: [Errno 12] Cannot allocate memory

    训练DQN,报错:OSError: [Errno 12] Cannot allocate memory 问题介绍: 这两天在做强化学习的作业,使用 DQN 打 Atari 游戏,但在训练过程中,出现了 ...

  8. 2018-8-10-win10-uwp-商业游戏-

    原文:2018-8-10-win10-uwp-商业游戏- title author date CreateTime categories win10 uwp 商业游戏 lindexi 2018-08- ...

  9. qt 界面去掉系统边框

    该代码在Qt5框架编辑,使用该类时, 直接继承这个类就可以了. 实现了拖拽功能和关闭功能,如果需要放大缩小功能, 需自己实现. 1 #ifndef CUSTOMIZE_QWIDGET_H #defin ...

  10. JavaScript的七种数据类型

    我知道这个话题网上说法非常多,甚至还有分出什么"Array,Function"之类的阿猫阿狗的类型.今天来整理这个话题的时候,先贴一张MDN官方的说法: 这个分法是对的,也是目前来 ...