解析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 相关文章推荐
c++生成dll使用python调用dll的方法
Jan 20 Python
介绍Python的Django框架中的QuerySets
Apr 20 Python
python中global用法实例分析
Apr 30 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
python使用str & repr转换字符串
Oct 13 Python
简单实现python聊天程序
Apr 01 Python
python for循环输入一个矩阵的实例
Nov 14 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
Python文件读写w+和r+区别解析
Mar 26 Python
Flask处理Web表单的实现方法
Jan 31 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函数
2006/10/09 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
Laravel实现ORM带条件搜索分页
2019/10/24 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
Div自动滚动到末尾的代码
2008/10/26 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
2013/11/22 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
浅谈numpy数组中冒号和负号的含义
2018/04/18 Python
numpy.random模块用法总结
2019/05/27 Python
django用户登录验证的完整示例代码
2019/07/21 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
CSS3 优势以及网页设计师如何使用CSS3技术
2009/07/29 HTML / CSS
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
阿迪达斯丹麦官网:adidas丹麦
2016/10/01 全球购物
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
爱的教育观后感
2015/06/17 职场文书
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
2021/03/29 PHP
Oracle中update和select 关联操作
2022/01/18 Oracle