Python局部变量与全局变量的作用域及修改机制详解
本文深入解析Python中局部变量与全局变量的定义、作用域差异及交互机制。通过代码示例说明如何在函数内访问和修改全局变量,重点讲解global关键字的使用场景,并区分不可变类型(如整数)与可变类型(如列表)在函数内修改时的行为差异,帮助开发者避免UnboundLocalError等常见错误。
局部变量的定义与作用
局部变量
局部变量的概念
通俗来说,局部变量是指在函数内部定义的变量。
具体实现代码如下:
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
结论分析:
- 局部变量特指在函数内部定义的变量。
- 不同函数内部可以存在名称相同的局部变量,它们相互独立,互不影响。
- 局部变量的主要作用是临时存储数据,即在函数执行过程中需要暂时保存的数据,通常通过定义局部变量来实现存储。
全局变量的定义
全局变量
全局变量的概念
定义:如果一个变量既可以在一个函数中使用,也可以在其他函数中访问,这样的变量被称为全局变量。
相关代码如下:
a = 100 # 定义一个全局变量a,并初始化为100
# 分别定义函数test1、test2,功能是打印变量a的值
def test1():
print(a)
def test2():
print(a)
test1()
test2()
"""
结果如下:
100
100
"""
全局变量的修改与global关键字
如何修改全局变量的值
初学者可能会尝试以下写法:
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。这是为什么呢?
原因分析:如果一个全局变量在函数内部被重新定义(赋值),那么在函数内使用该变量时,Python会默认将其视为局部变量;如果在函数内部没有定义该变量而直接使用,则视为全局变量。
在上述例子中,函数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,也可以通过方法(如append)修改全局变量的内容。
总结
以上所述是小编给大家介绍的python的局部变量和全局变量,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









