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实现的百度贴吧网络爬虫实例
Apr 17 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
python实现上传下载文件功能
Nov 19 Python
python逆向入门教程
Jan 15 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
python 实现矩阵按对角线打印
Nov 29 Python
Windows 平台做 Python 开发的最佳组合(推荐)
Jul 27 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
Aug 07 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
如何用Django处理gzip数据流
Jan 29 Python
python unittest单元测试的步骤分析
Aug 02 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
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
PHP检测接口Traversable用法详解
2017/12/29 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
Javascript 页面模板化很多人没有使用过的方法
2012/06/05 Javascript
js对象基础实例分析
2015/01/13 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
在Python的web框架中中编写日志列表的教程
2015/04/30 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
python查看模块,对象的函数方法
2018/10/16 Python
Python最小二乘法矩阵
2019/01/02 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
简单了解Django项目应用创建过程
2020/07/06 Python
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
企业管理标语
2014/06/10 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
文明家庭事迹材料
2014/12/20 职场文书
学前班学生评语
2014/12/29 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书