社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python中的命名空间和变量作用域

生信修炼手册 • 5 年前 • 647 次点击  
欢迎关注”生信修炼手册”!
namespace,称之为命名空间,是名称和对象之间的映射,通常以字典的形式保存变量名和其所指代的变量值之间的映射关系。

命名空间是变量名称的集合,程序在解析某个变量名称对应的值时,是通过命名空间来查找的,所以了解和掌握命名空间,有助于我们理解程序执行时的查找规则,写出符合预期的代码。

在同一个命名空间内,变量名称是唯一的,和字典的key一样,只有这样才可以保证唯一解析到正确的值,而不同命名空间是独立的,不同命名空间内变量名称的重复是允许的。

在python中,存在了3种命名空间,按照搜索的优先级,从高到低,排列如下

  1. 局部命名空间,每个函数的变量,参数所构成的空间

  2. 全局命名空间,模块级的变量,注意一个python脚本也是一个模块

  3. 内置命名空间,python内置的常量,函数所构成的空间

对于一个变量,首先从其所在函数的局部命名空间进行查找,如果没找到,就到上一级,全局命名空间进行查找,如果还没找到,就到内置命名空间进行查找,如果连内置命名空间都找不到的话,就会抛出变量名未定义的异常,即NameError。

以上就是默认的命名空间查找规则,关于命名空间,还需要牢记一点,命名空间在定义时就已经生成。示例如下

>>> a = 2>>> def test1():...     print(a)...>>> test1()2>>>>>> def test2():...     a += 1...     print(a)...>>> test2()Traceback (most recent call last):  File "", line 1, in <module>  File "", line 2, in test2UnboundLocalError: local variable 'a' referenced before assignment

test2函数为什么没有使用全局命名空间中的a?原因就在于test2函数在定义时, 包含了一个变量a的赋值语句,这样程序认为在该函数的局部命名空间内已经存在了变量a,  而实际上是不存在,只有全局命名空间存在了变量a, 所以程序抛出了异常。

上述程序的本意是对全局命名空间的a进行操作。如果要实现这一点,就需要改变test2函数内a的命名空间。在python中,可以通过以下两个关键词来修饰变量,更改其命名空间

  1. global

  2. nonlocal


这两个关键词放在变量名称的开头,用于修饰变量,也称之为绑定变量,global将变量绑定在全局命名空间,nonlocal将变量绑定为非局命名空间,即全局和局部之间的命名空间,绑定之后,会直接在对应的命名空间进行查找,上述test2函数修改如下

>>> a = 2>>> def test2():...     global a...     a += 1...>>> test2()>>> a3

通过global关键字,将a绑定到全局命名空间,这样程序就会在全局命名空间查找a, 也就实现了我们的目的。所以,当我们在想要修改上层命名空间的变量时,就需要用到global和nonlocal关键字了。

·end·

—如果喜欢,快分享给你的朋友们吧—



原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!
本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。
  更多精彩



  写在最后


转发本文至朋友圈,后台私信截图即可加入生信交流群,和小伙伴一起学习交流。


扫描下方二维码,关注我们,解锁更多精彩内容!


一个只分享干货的

生信公众号






Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/63786
 
647 次点击