源本科技 | 码上会

Python 全局与局部变量

2026/01/16
5
0

学习目标

  • 理解局部变量与全局变量的定义、作用域及生命周期

  • 掌握变量在函数内外的访问规则与遮蔽现象

  • 学会使用 global 关键字修改全局变量

  • 能够分析并避免因变量作用域导致的常见错误

  • 明确全局变量与局部变量在程序设计中的适用场景


什么是局部变量

局部变量是在函数内部定义的变量,其作用域仅限于该函数内部。函数执行结束后,局部变量自动销毁。

局部变量的正常使用

def greet():
    message = "你好,欢迎来到 CodeLab!"
    print(message)

greet()

输出:

你好,欢迎来到 CodeLab!

message 是局部变量,只能在 greet() 内部访问。

尝试在函数外部访问局部变量

错误示例

def greet():
    message = "你好!"
    print("函数内:", message)

greet()
print("函数外:", message)  # 错误!

报错:

NameError: name 'message' is not defined

局部变量在函数结束后即被销毁,外部无法访问。


什么是全局变量

全局变量在所有函数之外定义,可在程序的任何位置(包括函数内部)被访问。

title = "Python 编程指南"

def show_title():
    print("标题(函数内):", title)

show_title()
print("标题(函数外):", title)

输出:

标题(函数内): Python 编程指南
标题(函数外): Python 编程指南

全局变量 title 在整个程序中都有效。


变量遮蔽

同名局部变量 vs 全局变量

当局部变量与全局变量同名时,局部变量会遮蔽全局变量,函数内部将优先使用局部变量。

name = "张三"  # 全局变量

def introduce():
    name = "李四"  # 局部变量,遮蔽全局变量
    print("函数内名字:", name)

introduce()
print("函数外名字:", name)

输出:

函数内名字: 李四
函数外名字: 张三

函数内部的 name 是全新的局部变量,对全局 name 无影响。


修改全局变量

使用 global 关键字

默认情况下,不能在函数内部直接修改全局变量。若需修改,必须使用 global 声明。

错误示例

未声明 global 直接修改

text = "学习 Python"

def update_text():
    text += " 很有趣!"  # 尝试修改全局变量
    print(text)

update_text()

报错:

UnboundLocalError: local variable 'text' referenced before assignment

Python 认为 text 是局部变量(因为有赋值操作),但尚未初始化就使用,导致错误。

正确做法

使用 global 声明

text = "学习 Python"

def update_text():
    global text          # 声明使用全局变量
    text += " 很有趣!"
    print("函数内:", text)

update_text()
print("函数外:", text)

输出:

函数内: 学习 Python 很有趣!
函数外: 学习 Python 很有趣!

修改后,全局变量 text 的值被永久改变。


综合示例

对比三种函数行为

counter = 10  # 全局变量

def read_only():
    print("只读:", counter)  # 直接读取全局变量

def create_local():
    counter = 20             # 创建局部变量
    print("局部:", counter)

def modify_global():
    global counter
    counter = 30             # 修改全局变量
    print("修改后:", counter)

print("初始值:", counter)
read_only()
print("调用 read_only 后:", counter)

create_local()
print("调用 create_local 后:", counter)

modify_global()
print("调用 modify_global 后:", counter)

输出:

初始值: 10
只读: 10
调用 read_only 后: 10
局部: 20
调用 create_local 后: 10
修改后: 30
调用 modify_global 后: 30

关键点:

  • 仅读取 → 自动使用全局变量

  • 赋值(无 global)→ 创建局部变量

  • 赋值(有 global)→ 修改全局变量


全局变量/局部变量

对比维度

全局变量

局部变量

定义位置

函数外部

函数内部

作用域

整个程序

仅限定义它的函数

生命周期

程序启动到结束

函数调用开始到返回

数据共享

所有函数均可访问

仅本函数内部可用

内存管理

存储在全局命名空间

存储在函数调用栈帧中

修改方式

global 声明才能在函数内修改

直接赋值即可

设计建议

少用,避免副作用

推荐使用,提高封装性


重点总结

  • 局部变量:函数内定义,仅在函数内有效,函数结束即销毁

  • 全局变量:函数外定义,全程序可访问

  • 同名时,局部变量遮蔽全局变量

  • 修改全局变量必须使用 global 关键字

  • 读取全局变量无需声明,但赋值会创建局部变量(除非声明 global)

  • 合理使用变量作用域是编写清晰、健壮代码的关键


思考题

  1. 为什么 Python 默认不允许在函数内直接修改全局变量?这种设计如何帮助避免程序错误?

  2. 在大型项目中,过度依赖全局变量可能带来哪些维护难题?你能提出哪些替代方案?

  3. 如果一个函数既需要读取又需要修改全局变量,是否应该将其拆分为两个函数(一个读,一个写)?为什么?