解析python的局部变量和全局变量


Posted in Python onAugust 15, 2019

局部变量

什么是局部变量

通俗定义:函数内部定义的变量就叫局部变量。

话不多说,代码如下:

def test1():
 a = 300 # 定义一个局部变量a,并初始化300
 print("--test1--修改前:a=%s" % a)
 a = 200 # 给变量a重新赋值200
 print("--test1--修改后:a=%s" % a)
def test2():
 a = 400 # 定义另一个局部变量a,并初始化400
 print("--test2--修改后:a=%s" % a)
# 分别调用函数test1,test2
test1()
test2()

输出:

--test1--修改前:a=300
--test1--修改后:a=200
--test2--修改后:a=400

结论:

  1. 局部变量就是在函数内部定义的变量。
  2. 不同的函数内部可以定义名字相同的变量,但它们不会产生影响。
  3. 局部变量的作用,为了临时保存数据需要在需要在函数中定义变量来进行存储。

全局变量

什么是全局变量

定义:如果一个变量既能在一个函数中使用,也可以在其他函数中使用,这样的变量就是全局变量。 

代码如下:

a = 100 # 定义一个全局变量a,并初始化为100
# 分别定义函数test1、test2,功能是打印变量a的值
def test1():
 print(a)
def test2():
 print(a)
test1()
test2()
"""
结果如下:
100
100
"""

如何修改全局变量的值

首先,我们可能是这样想的:

a = 100 # 定义一个全局变量a,并初始化为100
# 分别定义函数test1、test2
def test1():
 print("修改前:a=%s"%a)
 a = 300
 print("修改后:a=%s"%a)
def test2():
 print(2)
test1()
test2()
"""

结果如下:

UnboundLocalError: local variable 'a' referenced before assignment

异常解释:局部变量a在被引用前没有被定义

"""
那我们把函数test1中的内容修改如下:

def test1():
 # print("修改前:a=%s"%a)
 a = 300
 print("修改后:a=%s"%a)

"""
结果如下:
修改后:a=300
100
"""

这次我们发现,错误消失了,函数test2中打印变量a的值并没有改变还是100,这是为什么呢?

原因:如果一个全局变量在函数内被重新定义过,再在函数内使用变量则默认为局部变量;如果在函数内没有被定义,直接使用会被视为全局变量。

此时,函数test1中的只是定义了一个名字相同的局部变量而已,并没有改变全局变量的值。

global的使用

这前我们想的法子都不能修改全局变量的值,这下就该认识一个新的关键字 global ,它的功能就是如果需要在函数内定义(修改)全局变量,则要先用global进行声明。

把之前的代码修改如下:

a = 100 # 定义一个全局变量a,并初始化为100
# 分别定义函数test1、test2
def test1():
 global a # 声明函数中使用的a是全局变量
 print("修改前:a=%s" % a)
 a = 300
 print("修改后:a=%s" % a)
def test2():
 print(2)
test1()
test2()

"""
结果如下:
修改前:a=100
修改后:a=300
300
"""

这下终于修改成功了。

可变类型与不可变类型的全局变量

发现我们之前定义的全局变量是数字类型,是属于不可变类型的,那么修改一个可变类型的全局变量有什么不同呢?

a = [100, 200] # 定义一个列表全局变量a
# 分别定义函数test1、test2
def test1():
 print("修改前:a=%s" % a)
 a.append(300)
 print("修改后:a=%s" % a)
def test2():
 print(a)
test1()
test2()
"""

结果如下:

修改前:a=[100, 200]
修改后:a=[100, 200, 300]
[100, 200, 300]
"""

我们发现当全局变量为可变类型时,即使我们不是用global关键字声明全局变量,它还是会被修改。

事实上:

  • 在函数中不是用global声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即不能将全局变量指向新的数据。
  • 对于不可变类型的全局变量来说,因其指向的数据不能被修改,所以不是用global时无法修改全局变量。
  • 对于可变类型的全局变量来说,因其指向的数据可以改变,所以不用global时可以修改全局变量。

总结

以上所述是小编给大家介绍的python的局部变量和全局变量,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python操作列表之List.insert()方法的使用
May 20 Python
python爬虫之urllib3的使用示例
Jul 09 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
Flask框架WTForm表单用法示例
Jul 20 Python
ActiveMQ:使用Python访问ActiveMQ的方法
Jan 30 Python
详解Python使用Plotly绘图工具,绘制甘特图
Apr 02 Python
详解pandas中MultiIndex和对象实际索引不一致问题
Jul 23 Python
Django框架之中间件MiddleWare的实现
Dec 30 Python
Django用数据库表反向生成models类知识点详解
Mar 25 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
matplotlib jupyter notebook 图像可视化 plt show操作
Apr 24 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
python实现的自动发送消息功能详解
Aug 15 #Python
python调用支付宝支付接口流程
Aug 15 #Python
Python使用字典实现的简单记事本功能示例
Aug 15 #Python
Flask框架学习笔记之模板操作实例详解
Aug 15 #Python
Flask框架学习笔记之消息提示与异常处理操作详解
Aug 15 #Python
python打造爬虫代理池过程解析
Aug 15 #Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 #Python
You might like
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
2016/03/29 PHP
PHP实现图片压缩
2020/09/09 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
JS 控制CSS样式表
2009/08/20 Javascript
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
爬虫利器Puppeteer实战
2019/01/09 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
详细讲解Python中的文件I/O操作
2015/05/24 Python
Python读写unicode文件的方法
2015/07/10 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
详解python while 函数及while和for的区别
2018/09/07 Python
Python登录系统界面实现详解
2019/06/25 Python
python双向链表原理与实现方法详解
2019/12/03 Python
python求绝对值的三种方法小结
2019/12/04 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
婚礼主持词
2014/03/13 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
实验室的标语
2014/06/20 职场文书
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android