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 相关文章推荐
pyqt4教程之实现半透明的天气预报界面示例
Mar 02 Python
python解析含有重复key的json方法
Jan 22 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
Feb 15 Python
对Python3 序列解包详解
Feb 16 Python
python 批量添加的button 使用同一点击事件的方法
Jul 17 Python
python科学计算之scipy——optimize用法
Nov 25 Python
Pytorch的mean和std调查实例
Jan 02 Python
使用Python获取当前工作目录和执行命令的位置
Mar 09 Python
python3 使用traceback定位异常实例
Mar 09 Python
pycharm解决关闭flask后依旧可以访问服务的问题
Apr 03 Python
Python 如何批量更新已安装的库
May 26 Python
Python直接赋值及深浅拷贝原理详解
Sep 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
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
JS遍历数组及打印数组实例分析
2016/01/21 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
js 实现 list转换成tree的方法示例(数组到树)
2019/08/18 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
Python编写一个闹钟功能
2017/07/11 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
Python饼状图的绘制实例
2019/01/15 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
HTML5实现锚点时请使用id取代name
2013/09/06 HTML / CSS
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
护士在校生自荐信
2014/02/01 职场文书
启动仪式策划方案
2014/06/14 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
房屋租房协议书范本
2014/12/04 职场文书
个人工作年终总结
2015/03/09 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers