理解局部变量与全局变量的定义、作用域及生命周期
掌握变量在函数内外的访问规则与遮蔽现象
学会使用 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 assignmentPython 认为
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)
合理使用变量作用域是编写清晰、健壮代码的关键
为什么 Python 默认不允许在函数内直接修改全局变量?这种设计如何帮助避免程序错误?
在大型项目中,过度依赖全局变量可能带来哪些维护难题?你能提出哪些替代方案?
如果一个函数既需要读取又需要修改全局变量,是否应该将其拆分为两个函数(一个读,一个写)?为什么?