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

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

作者头像
生信修炼手册
发布2020-05-28 20:57:30
1.2K0
发布2020-05-28 20:57:30
举报
文章被收录于专栏:生信修炼手册生信修炼手册

namespace,称之为命名空间,是名称和对象之间的映射,通常以字典的形式保存变量名和其所指代的变量值之间的映射关系。

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

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

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

  1. 局部命名空间,每个函数的变量,参数所构成的空间
  2. 全局命名空间,模块级的变量,注意一个python脚本也是一个模块
  3. 内置命名空间,python内置的常量,函数所构成的空间

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

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

代码语言:javascript
复制
>>> a = 2
>>> def test1():
...     print(a)
...
>>> test1()
2
>>>
>>> def test2():
...     a += 1
...     print(a)
...
>>> test2()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in test2
UnboundLocalError: local variable 'a' referenced before assignment

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

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

  1. global
  2. nonlocal

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

代码语言:javascript
复制
>>> a = 2
>>> def test2():
...     global a
...     a += 1
...
>>> test2()
>>> a
3

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

·end·

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信修炼手册 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档