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 web程序
Sep 11 Python
深入理解Python中的元类(metaclass)
Feb 14 Python
解读Django框架中的低层次缓存API
Jul 24 Python
Python实现统计文本文件字数的方法
May 05 Python
python学习必备知识汇总
Sep 08 Python
Python实现删除时保留特定文件夹和文件的示例
Apr 27 Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 Python
python定时按日期备份MySQL数据并压缩
Apr 19 Python
python for循环remove同一个list过程解析
Aug 14 Python
django admin后管定制-显示字段的实例
Mar 11 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
Jun 23 Python
Python中的With语句的使用及原理
Jul 29 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
Php Ctemplate引擎开发相关内容
2012/03/03 PHP
php读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
php检查字符串中是否有外链的方法
2015/07/29 PHP
eval与window.eval的差别分析
2011/03/17 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
jquery实现倒计时功能
2015/12/28 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
原生js封装的ajax方法示例
2018/08/02 Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
2018/09/12 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
Python数组定义方法
2016/04/13 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
浅谈Python peewee 使用经验
2017/10/20 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
数控技术应届生求职信
2013/11/13 职场文书
思想品德自我评价
2014/02/04 职场文书
文员的职业生涯规划发展方向
2014/02/08 职场文书
给妈妈洗脚活动方案
2014/08/16 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
毕业班工作总结
2015/08/10 职场文书
小学教师教育随笔
2015/08/14 职场文书
组织委员竞选稿
2015/11/21 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
教你nginx跳转配置的四种方式
2022/07/07 Servers