Python作用域与名字空间原理详解


Posted in Python onMarch 21, 2020

Python具有静态作用域,变量的作用域由它定义的位置决定,而与调用的位置无关。

 a = 2 
def f():
 a = 2

第一行的a的作用域是全局作用域,作用于定义位置后面的所有位置。

第四行的a的作用域是局部作用域,作用于f函数里。

Python能够形成局部作用域的只有函数与类,其他语句不形成局部作用域。

函数与类的局部作用域

def f():
  a = 1
class A:
  b = 2
if 1 == 1:
  c = 3
for _ in range(1):
  d = 4
while True:
  e = 5
  break
print(c, d, e)
try:
  print(a)
except Exception as e:
  print(e)
try:
  print(b)
except Exception as e:
  print(e)

输出结果

 3 4 5
 name 'a' is not defined
 name 'b' is not defined

python动态运行时,每个作用域都有三个名字空间:由局部变量组成的local名字空间,由全局变量组成的global名字空间,以及python内建模块的builtins名字空间,在查询一个变量时,搜索顺序为local->global->builtins,即局部变量屏蔽全局变量,全局变量屏蔽内建变量。

python的global名字空间是动态的,即每遇到一个赋值语句(def与class也属于赋值语句),global名字空间都可能发生变化。

global名字空间的动态变化

 print(dir())
 a = 1
 print(dir())
 b = 2
 print(dir())

输出结果

1 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
2 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a']
3 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'b']

从输出结果可以看出,global名字空间是动态增加的。

这意味着,虽然位于global名字空间的变量叫做全局变量,它的作用范围也不是全局位置,它只作用于第一次赋值之后的位置。因为只有在变量赋值初始化的时候,它才会被加入到global名字空间中。

函数和类搜索的global名字空间是调用位置的global名字空间,与定义位置无关

def f():
  print(a)

try:
  f()
except Exception as e:
  print(e)

a = 2
f()

输出结果

name 'a' is not defined
2

函数f打印全局变量a,a在第9行定义。在第五行调用f的时候,a不在global名字空间中,所以会输出错误信息,在第十行再次调用函数f时,a已经加入了global名字空间,所以能够打印出a。

python为了提高效率,local名字空间是静态实现的,因为对于一个函数来说,它所包含的局部变量是明确已知的。

函数的local名字空间是静态的

a = 4
def f():
  try:
    print(a)
  except Exception as e:
    print(e)
  a = 1
f()

输出结果

 local variable 'a' referenced before assignment

在打印a的时候,在local名字空间中找到了a,但是这时候a并没有赋值初始化,所以抛出异常。这也说明了local名字空间与global名字空间不同,它会在一开始就把所有的局部变量加入到名字空间中。

总结:

1. python是静态作用域,变量初始化的位置决定了它的作用域,而与变量调用的位置无关

2. global名字空间是动态的,不同位置的global名字空间不同,local名字空间是静态的,局部变量在整个局部作用域内可见。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python线程中对join方法的运用的教程
Apr 09 Python
Python 中 Meta Classes详解
Feb 13 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
python 杀死自身进程的实现方法
Jul 01 Python
通过python3实现投票功能代码实例
Sep 26 Python
DRF框架API版本管理实现方法解析
Aug 21 Python
python实现简单的五子棋游戏
Sep 01 Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 Python
Python 可视化神器Plotly详解
Dec 26 Python
Pyhton模块和包相关知识总结
May 12 Python
Python下载商品数据并连接数据库且保存数据
Mar 31 Python
Python小整数对象池和字符串intern实例解析
Mar 21 #Python
Python描述符descriptor使用原理解析
Mar 21 #Python
Python如何省略括号方法详解
Mar 21 #Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 #Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
Mar 20 #Python
python+opencv实现移动侦测(帧差法)
Mar 20 #Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 #Python
You might like
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
[02:08]2018年度CS GO枪械皮肤设计大赛优秀作者-完美盛典
2018/12/16 DOTA
python实现定制交互式命令行的方法
2014/07/03 Python
详解Python中的条件判断语句
2015/05/14 Python
详解Python网络爬虫功能的基本写法
2016/01/28 Python
Python程序暂停的正常处理方法
2019/11/07 Python
基于python实现查询ip地址来源
2020/06/02 Python
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
护理自荐信范文
2013/10/05 职场文书
学生打架检讨书1000字
2014/01/16 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
公务员政审材料范文
2014/12/23 职场文书
琅琊山导游词
2015/02/05 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
决心书格式及范文
2019/06/24 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
使用feign服务调用添加Header参数
2021/06/23 Java/Android
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js
python绘制简单直方图(质量分布图)的方法
2022/04/21 Python
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis