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网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
python中bisect模块用法实例
Sep 25 Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 Python
Python构建网页爬虫原理分析
Dec 19 Python
python微信跳一跳系列之自动计算跳一跳距离
Feb 26 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
python tkinter图形界面代码统计工具
Sep 18 Python
在Python中预先初始化列表内容和长度的实现
Nov 28 Python
Python使用docx模块实现刷题功能代码
Feb 13 Python
Python astype(np.float)函数使用方法解析
Jun 08 Python
opencv 图像滤波(均值,方框,高斯,中值)
Jul 08 Python
Python何绘制带有背景色块的折线图
Apr 23 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 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
深入理解 PHP7 中全新的 zval 容器和引用计数机制
2018/10/15 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
解决php写入数据库乱码的问题
2019/09/17 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
html文件中jquery与velocity变量中的$冲突的解决方法
2013/11/01 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
Python中的exec、eval使用实例
2014/09/23 Python
利用python微信库itchat实现微信自动回复功能
2017/05/18 Python
python实现输入数字的连续加减方法
2018/06/22 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
python中open函数的基本用法示例
2019/09/07 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
药学职务聘任书
2014/03/29 职场文书
中学生英语演讲稿
2014/04/26 职场文书
聘任合同书
2015/09/21 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
JavaScript实现简单图片切换
2021/04/29 Javascript