Python中全局变量和局部变量的理解与区别


Posted in Python onFebruary 07, 2021

前言

学过编程的人应该对全局变量与局部变量这两个名词并不陌生,Python也同多数编程语言一样,也有全局变量与局部变量的概念

但是与其他编程语言又有所不同

全局变量与局部变量两者的本质区别就是在于作用域

用通俗的话来理解的话,

全局变量是在整个py文件中声明,全局范围内都可以访问

局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了

如果在函数内部定义与某个全局变量一样名称的局部变量,就可能会导致意外的效果,可能不是你期望的。因此不建议这样使用,这样会使得程序很不健全

直接来看几个例子来理解全局变量和局部变量的区别吧:

Demo1:

def fun(x):
 y=2
 print("乘法的运行结果:",x*y)
num1=1
print("初始num1=",num1)
fun(num1)
print("y的值是:",y)

运行结果:

Python中全局变量和局部变量的理解与区别

报错的原因是因为试图访问局部变量,但是访问的地方不在该变量y的作用域中

Demo2:

def fun():
 num1=2
 print("函数内修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("运行完函数后num1=",num1)

运行结果:

Python中全局变量和局部变量的理解与区别

可以看到在函数内部对全局变量的修改后,在函数执行完毕,修改的结果是无效的,全局变量并不会受到影响

再看:

Demo3:

def fun():
 num1*=2
 print("函数内修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("运行完函数后num1=",num1)

运行结果:

Python中全局变量和局部变量的理解与区别

报错了。这是因为在fun()函数使用了局部变量num1,它只是个跟全局变量同名的局部变量,使用前还是要赋值,因此再次强调不要这样使用

global关键字

如果真的想要在函数体内修改全局变量的值,就要使用global关键字

Demo4:

def fun():
 global num1
 num1=2
 print("函数内修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("运行完函数后num1=",num1)

运行结果:

Python中全局变量和局部变量的理解与区别

使用global关键字就是告诉python编译器这个变量不是局部变量而是全局变量,其实有点像是"引用"的意思

nonlocal关键字

再看看另一个跟变量相关的关键字nonlocal,字面意思就是指当前的这个变量不是局部变量。nonlocal是Python3.0中新增的关键字,python2.x不支持

先来看看下面这段代码

def fun():
 num2=3
 def fun2():
 num2*=2
 print("num2=",num2)
 return fun2()
 
fun()

运行结果:

Python中全局变量和局部变量的理解与区别

错误的原因跟前面的差不多,就是使用了未定义的局部变量,然而num2也不是全局变量,只是fun2函数的外层变量,强行使用global定义num2的话同样会报错(不信你试试)

这时候需要使用nonlocal关键字:

def fun():
 num2=3
 def fun2():
 nonlocal num2
 num2*=2
 print("num2=",num2)
 return fun2()
 
fun()

运行结果:

Python中全局变量和局部变量的理解与区别

如此,程序就能正常执行

总结

到此这篇关于Python中全局变量和局部变量的文章就介绍到这了,更多相关Python全局变量和局部变量内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 字符串中的字符倒转
Sep 06 Python
详解使用Python处理文件目录的相关方法
Oct 16 Python
Python+Turtle动态绘制一棵树实例分享
Jan 16 Python
python实现简易通讯录修改版
Mar 13 Python
Python向excel中写入数据的方法
May 05 Python
pandas计数 value_counts()的使用
Jun 24 Python
详解用Python为直方图绘制拟合曲线的两种方法
Aug 21 Python
python 公共方法汇总解析
Sep 16 Python
django多种支付、并发订单处理实例代码
Dec 13 Python
Python接口自动化判断元素原理解析
Feb 24 Python
pycharm解决关闭flask后依旧可以访问服务的问题
Apr 03 Python
Django之全局使用request.user.username的实例详解
May 14 Python
Python抖音快手代码舞(字符舞)的实现方法
Feb 07 #Python
Python图像处理之膨胀与腐蚀的操作
Feb 07 #Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 #Python
python数据抓取3种方法总结
Feb 07 #Python
python 批量将中文名转换为拼音
Feb 07 #Python
如何用用Python将地址标记在地图上
Feb 07 #Python
python 三种方法提取pdf中的图片
Feb 07 #Python
You might like
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
用PHP写的基于Memcache的Queue实现代码
2011/11/27 PHP
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
PHP树-不需要递归的实现方法
2016/06/21 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
javascript 必知必会之closure
2009/09/21 Javascript
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
2010/05/22 Javascript
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
angular4自定义组件详解
2017/09/28 Javascript
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
8 个有用的JS技巧(推荐)
2019/07/03 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
Python 中的lambda函数介绍
2018/10/10 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
使用Keras构造简单的CNN网络实例
2020/06/29 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
python 模块导入问题汇总
2021/02/01 Python
旅游管理实习自我鉴定
2013/09/29 职场文书
大学总结自我鉴定
2014/01/18 职场文书
初一科学教学反思
2014/01/27 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
外贸业务员求职信
2014/06/16 职场文书