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

所属分类: 脚本专栏 / python 阅读数: 1828
收藏 0 赞 0 分享

局部变量

什么是局部变量

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

话不多说,代码如下:

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的局部变量和全局变量,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

更多精彩内容其他人还在看

深入浅析python3中的unicode和bytes问题

在python3中,有两种字符串类型,默认的就是str,即unicode,也叫做文本类型。这篇文章主要介绍了python3中的unicode和bytes问题,需要的朋友可以参考下
收藏 0 赞 0 分享

python3 自动识别usb连接状态,即对usb重连的判断方法

今天小编就为大家分享一篇python3 自动识别usb连接状态,即对usb重连的判断方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

python二进制文件的转译详解

这篇文章主要介绍了python二进制文件的转译详解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

python字符串中匹配数字的正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。这篇文章主要介绍了python字符串中匹配数字的正则表达式 ,需要的朋友可以参考下
收藏 0 赞 0 分享

在Python中COM口的调用方法

今天小编就为大家分享一篇在Python中COM口的调用方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Python read函数按字节(字符)读取文件的实现

这篇文章主要介绍了Python read函数按字节(字符)读取文件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

python读取图片的方式,以及将图片以三维数组的形式输出方法

今天小编就为大家分享一篇python读取图片的方式,以及将图片以三维数组的形式输出方法,具有好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

在python中利用numpy求解多项式以及多项式拟合的方法

今天小编就为大家分享一篇在python中利用numpy求解多项式以及多项式拟合的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Python正则表达式匹配数字和小数的方法

这篇文章主要介绍了Python正则匹配数字和小数的方法,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

python读写配置文件操作示例

这篇文章主要介绍了python读写配置文件操作,结合实例形式分析了Python针对ini配置文件的读取、解析、写入等相关操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多