Python——作用域和命名空间

高阶提示:对于高级Python程序员来说,了解这个主题是有用的。
首先我们先看一下,作用域和命名空间是什么?

1 命名空间(Namespace)

一个名字到对象的映射。

有点像字典的功能。命名空间举例来说有:内置的函数;模块里面的全局变量;函数里面的局部变量。一个对象的属性也是一个命名空间。命名空间的作用是为了防止名字(函数等)的冲突。
这里的属性指的任何在点之后的名字。如:z.real,则real是对象z的属性。

from math import random
a = 'love'

这种情况下,random和a在同一个命名空间。

命名空间的生存周期

内置的命名空间,在解释器启动之后被创建、从不被删除;
全局的命名空间在模块启动后创建,持续到解释器关闭;
局部的命名空间在函数被调用时启动,函数返回或出现错误时结束;递归调用也如此。

2 作用域(scope)

作用域是一个python程序的文本区域,其中可以直接访问命名空间。

在执行期间的任何时候,至少有三个可直接访问其命名空间的嵌套作用域:

  • 首先搜索的作用域为本地名称,local;
  • 嵌套作用域,non local,non global;
  • 模块的全局名称,global;
  • 最外层的是内置的命名空间。

通常情况下,本地名称指的是当前的函数(或类);出了函数,就是模块的全局命名空间;

3 例子

作用域和命名空间.png

可以看出,我们在主函数里面命名了一个spam,它属于non-local变量;
对于do_local函数里面的spam,它优先处理的是局部变量;
对于do_global函数里面的spam,它属于全局变量,无法对non-local变量进行修改。

感想:

  • 考虑变量的搜索范围,优先在自己的范围进行搜索;
  • 默认对参数的设置为当前范围;如在函数里就是local,在模块里就是global。
  • 若函数内对全局变量进行修改,需要声明这个变量就是全局的那个变量,加上global标识符。

参考文献:
Python-tutorial

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容