python的局部变量和全局变量
局部变量
什么是局部变量
通俗定义:函数内部定义的变量就叫局部变量。
话不多说,代码如下:
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
"""
如何修改全局变量的值
首先,我们可能是这样想的:
a = 100 # 定义一个全局变量a,并初始化为100
# 分别定义函数test1、test2
def test1():
print("修改前:a=%s"%a)
a = 300
print("修改后:a=%s"%a)
def test2():
print(a)
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时可以修改全局变量。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?