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 相关文章推荐
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
Mar 30 Python
Python中Django框架下的staticfiles使用简介
May 30 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
python针对excel的操作技巧
Mar 13 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
Python标准库shutil用法实例详解
Aug 13 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
Python创建或生成列表的操作方法
Jun 19 Python
在python3中实现更新界面
Feb 21 Python
Mac中PyCharm配置Anaconda环境的方法
Mar 04 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中的PHP_EOL换行符详细解析
2013/10/26 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
JavaScript插件化开发教程 (二)
2015/01/27 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
[04:16]DOTA2英雄梦之声_第09期_斧王
2014/06/21 DOTA
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
[01:12:35]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
python中迭代器(iterator)用法实例分析
2015/04/29 Python
python中多个装饰器的执行顺序详解
2018/10/08 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
python实现猜拳小游戏
2020/04/05 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
南京某软件公司的.net面试题
2015/11/30 面试题
shell变量的作用空间是什么
2013/08/17 面试题
优秀学生获奖感言
2014/02/15 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
小学新学期寄语
2014/04/02 职场文书
优秀学生党员先进事迹材料
2014/05/29 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
标枪加油稿
2015/07/22 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
PyTorch中permute的使用方法
2022/04/26 Python