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中的字典与成员运算符初步探究
Oct 13 Python
举例讲解Python中的Null模式与桥接模式编程
Feb 02 Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 Python
python解决pandas处理缺失值为空字符串的问题
Apr 08 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
Python 实现中值滤波、均值滤波的方法
Jan 09 Python
python实现超市管理系统(后台管理)
Oct 25 Python
python 类之间的参数传递方式
Dec 20 Python
python字典setdefault方法和get方法使用实例
Dec 25 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 Python
Python eval函数原理及用法解析
Nov 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伪静态的实现详细介绍
2013/04/28 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
JS中for循序中延迟加载动态效果的具体实现
2013/08/18 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
让你彻底掌握es6 Promise的八段代码
2017/07/26 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
[40:03]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
python 判断是否为正小数和正整数的实例
2017/07/23 Python
python编写Logistic逻辑回归
2020/12/30 Python
python五子棋游戏的设计与实现
2019/06/18 Python
python递归法解决棋盘分割问题
2019/07/17 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
大学生在校表现评语
2014/12/31 职场文书
材料员岗位职责范本
2015/04/11 职场文书
客户付款通知书
2015/04/23 职场文书
单位病假条范文
2015/08/17 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书