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中使用SAX解析xml实例
Nov 21 Python
Python中字符串的格式化方法小结
May 03 Python
python列表的常用操作方法小结
May 21 Python
Python多线程实现同步的四种方式
May 02 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
Django的models模型的具体使用
Jul 15 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
python Gunicorn服务器使用方法详解
Jul 22 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
pytorch torchvision.ImageFolder的用法介绍
Feb 20 Python
Python实战之疫苗研发情况可视化
May 18 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
用libtemplate实现静态网页生成
2006/10/09 PHP
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
javascript的回调函数应用示例
2014/02/20 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
莱鸟介绍window.print()方法
2016/01/06 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
基于jQuery.i18n实现web前端的国际化
2018/05/04 jQuery
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
Flask之flask-session的具体使用
2018/07/26 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
Python类的动态绑定实现原理
2020/03/21 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
出纳员岗位职责风险
2014/03/06 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
党课培训心得体会
2014/09/02 职场文书
政风行风评议心得体会
2014/10/21 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
合同纠纷调解书
2015/05/20 职场文书
生日寿星公答谢词
2015/09/29 职场文书
接收函
2019/04/22 职场文书
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS