Python局部变量与全局变量的作用域及修改机制详解

程一诺
程一诺
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析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

结论分析:

  1. 局部变量特指在函数内部定义的变量。
  2. 不同函数内部可以存在名称相同的局部变量,它们相互独立,互不影响。
  3. 局部变量的主要作用是临时存储数据,即在函数执行过程中需要暂时保存的数据,通常通过定义局部变量来实现存储。

全局变量的定义

全局变量

全局变量的概念

定义:如果一个变量既可以在一个函数中使用,也可以在其他函数中访问,这样的变量被称为全局变量。

相关代码如下:


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

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。