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设置windows桌面壁纸的实现代码
Jan 28 Python
python的urllib模块显示下载进度示例
Jan 17 Python
Python中MYSQLdb出现乱码的解决方法
Oct 11 Python
实例讲解Python中整数的最大值输出
Mar 17 Python
关于Pytorch的MLP模块实现方式
Jan 07 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
Feb 28 Python
python sitk.show()与imageJ结合使用常见的问题
Apr 20 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
基于python代码批量处理图片resize
Jun 04 Python
关于tf.matmul() 和tf.multiply() 的区别说明
Jun 18 Python
pytorch实现手写数字图片识别
May 20 Python
Pandas搭配lambda组合使用详解
Jan 22 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编写和读取XML的几种方式
2013/01/12 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
php给数组赋值的实例方法
2019/09/26 PHP
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
使用jquery操作session方法分享
2015/01/22 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
zTree树形插件异步加载方法详解
2017/06/14 Javascript
vue中Element-ui 输入银行账号每四位加一个空格的实现代码
2018/09/14 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python插入排序算法的实现代码
2013/11/21 Python
Python入门篇之字符串
2014/10/17 Python
Python3.2中Print函数用法实例详解
2015/05/19 Python
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
使用python接入微信聊天机器人
2020/03/31 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
华为python面试题
2016/05/03 面试题
北大青鸟学生求职信
2013/09/24 职场文书
女方婚礼新郎答谢词
2014/01/11 职场文书
国际贸易专业个人求职信格式
2014/02/02 职场文书
十八届三中全会个人学习材料
2014/02/13 职场文书
计算机应届毕业生自荐信范文
2014/02/23 职场文书
终止劳动合同协议书
2014/04/14 职场文书
敬老月活动总结
2014/08/28 职场文书
幼儿园见习报告
2014/10/30 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
Mysql事务索引知识汇总
2022/03/17 MySQL