
Python 函数内对同名变量赋值默认创建局部变量,若要修改全局变量,必须显式声明 global,否则外部变量值保持不变。
python 函数内对同名变量赋值默认创建局部变量,若要修改全局变量,必须显式声明 `global`,否则外部变量值保持不变。
在 Python 中,变量作用域遵循 LEGB 规则(Local → Enclosing → Global → Built-in),而赋值操作会改变作用域判定逻辑:只要函数内部对某个变量名执行了赋值(如 num = num1),Python 就默认该变量为局部变量,即使同名全局变量已存在。这正是你代码中 print(num) 输出 0 的根本原因。
来看你的原始代码:
num = 0
def average(num1, num2, num3):
num = num1 # ⚠️ 此处创建了局部变量 'num',与全局 num 无关
return (num1 + num2 + num3) / 3
print(average(7, 5, 9)) # 输出 7.0(局部 num 被设为 7,但未影响全局)
print(average(6, 6, 7)) # 输出 6.333...(局部 num 被设为 6,仍只作用于函数内)
print(num) # 输出 0 —— 全局 num 自始至终未被修改
尽管 num = num1 看似“修改了全局变量”,但由于缺少 global 声明,Python 将其解释为在函数作用域内新建一个局部变量 num,因此全局 num 始终保持初始值 0。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
✅ 正确做法:在函数内需修改全局变量时,必须在赋值前用 global 显式声明:
num = 0
def average(num1, num2, num3):
global num # ✅ 声明:接下来对 num 的赋值将作用于全局变量
num = num1 # 现在真正修改了全局 num
return (num1 + num2 + num3) / 3
print(average(7, 5, 9)) # 返回 7.0,同时全局 num 变为 7
print(average(6, 6, 7)) # 返回 6.333...,同时全局 num 变为 6
print(num) # 输出 6 —— 符合预期
⚠️ 注意事项:
- global 声明必须出现在函数体顶部(在首次使用该变量之前),且仅对当前函数生效;
- 不要混淆 global 与 nonlocal:后者用于嵌套函数中修改外层(非全局)作用域变量;
- 过度依赖全局变量会降低代码可读性与可测试性,建议优先通过函数参数传入、返回值传出数据;
- 若需维护多个相关状态,更推荐封装为类(class),利用实例属性管理状态。
总结:Python 的“赋值即局部”机制是设计使然,不是 bug。理解并正确使用 global 是掌握作用域控制的关键一步——但请记住:能不用,尽量不用;必须用时,务必显式声明。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










