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网络编程之文件下载实例分析
May 20 Python
可能是最全面的 Python 字符串拼接总结【收藏】
Jul 09 Python
Python魔法方法详解
Feb 13 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
Apr 17 Python
详解PyCharm安装MicroPython插件的教程
Jun 24 Python
Python制作微信好友背景墙教程(附完整代码)
Jul 17 Python
Python如何调用外部系统命令
Aug 07 Python
哪些是python中web开发框架
Jun 17 Python
flask开启多线程的具体方法
Aug 02 Python
关于python scrapy中添加cookie踩坑记录
Nov 17 Python
Python系统公网私网流量监控实现流程
Nov 23 Python
python函数的两种嵌套方法使用
Apr 02 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在服务器执行exec命令失败的解决方法
2012/03/03 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
Javascript 事件流和事件绑定
2009/07/16 Javascript
JavaScript 动态生成方法的例子
2009/07/22 Javascript
Javascript this指针
2009/07/30 Javascript
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
JavaScript小技巧整理篇(非常全)
2016/01/26 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
Vue监听数组变化源码解析
2017/03/09 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
介绍Python中的__future__模块
2015/04/27 Python
使用python编写简单的小程序编译成exe跑在win10上
2018/01/15 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
adidas美国官网:adidas US
2016/09/21 全球购物
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
一年级学生评语大全
2014/04/21 职场文书
环保建议书100字
2014/05/14 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
十月围城观后感
2015/06/08 职场文书
jQuery实现影院选座订座效果
2021/04/13 jQuery
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技