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之眼花缭乱的运算符
Sep 14 Python
用Python编写简单的微博爬虫
Mar 04 Python
python中numpy.zeros(np.zeros)的使用方法
Nov 07 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
Mar 19 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
Jul 04 Python
Python3.7 dataclass使用指南小结
Feb 22 Python
详解Python传入参数的几种方法
May 16 Python
pandas DataFrame创建方法的方式
Aug 02 Python
python中property和setter装饰器用法
Dec 19 Python
Django 设置多环境配置文件载入问题
Feb 25 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
Jan 23 Python
Python日志模块logging用法
Jun 05 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
调频问题解答
2021/03/01 无线电
利用“多说”制作留言板、评论系统
2015/07/14 PHP
PHP连接MySQL数据库三种实现方法
2020/12/10 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
javascript 随机展示头像实现代码
2011/12/06 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
2013/12/27 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
python3访问sina首页中文的处理方法
2014/02/24 Python
Python实现简单的四则运算计算器
2016/11/02 Python
python读取各种文件数据方法解析
2018/12/29 Python
Django数据库迁移常见使用方法
2020/11/12 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
python实现计算图形面积
2021/02/22 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
表达自我的市场:Society6
2018/08/01 全球购物
中学生团员自我评价分享
2013/12/07 职场文书
医学生自我评价
2014/01/27 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
起诉意见书范文
2015/05/19 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
浅谈Redis在直播场景的实践方案
2021/04/27 Redis