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 相关文章推荐
在Linux系统上部署Apache+Python+Django+MySQL环境
Dec 24 Python
Python实现翻转数组功能示例
Jan 12 Python
Python多层装饰器用法实例分析
Feb 09 Python
Python matplotlib绘图可视化知识点整理(小结)
Mar 16 Python
Python中一行和多行import模块问题
Apr 01 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
Jan 29 Python
django创建简单的页面响应实例教程
Sep 06 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
Apr 26 Python
在django中form的label和verbose name的区别说明
May 20 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
属性与 @property 方法让你的python更高效
Sep 21 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
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
JavaScript获取路径设计源码
2014/05/22 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
2015/03/04 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
2019/04/17 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
python执行外部程序的常用方法小结
2015/03/21 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
Python骚操作之动态定义函数
2019/03/26 Python
关于Pytorch的MNIST数据集的预处理详解
2020/01/10 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
利用Python优雅的登录校园网
2020/10/21 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
什么是网络协议
2016/04/07 面试题
逃课上网检讨书
2014/02/20 职场文书
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python