global和nonlocal是绕过legb规则的显式绑定声明机制,不改变作用域本身而强制指定变量绑定目标;用错会导致赋值无效、nameerror或syntaxerror。

global 和 nonlocal 不是“影响作用域”,而是**绕过默认作用域查找规则(LEGB)的显式声明机制**——它们不改变作用域本身,但强行指定变量绑定目标。一旦用错,轻则赋值无效,重则触发 NameError 或 SyntaxError。
函数内修改全局变量却不生效?漏了 global
Python 默认遵循 LEGB 规则:局部 → 外层嵌套 → 全局 → 内置。当你在函数里写 x = 10,解释器会认为你在定义新局部变量,哪怕外面已有同名全局变量。
- 没加
global x:赋值只作用于局部,外部变量不变 - 加了
global x:后续所有对x的读写都指向模块级变量 - 常见错误:在
global声明前就引用x,比如print(x); global x→UnboundLocalError - 注意:只读全局变量无需
global;只有写操作才需要
嵌套函数里改外层变量报 SyntaxError: no binding for nonlocal?
nonlocal 要求目标变量必须存在于**最近的外层函数局部作用域中**,不能是全局变量,也不能根本不存在。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 写
nonlocal x但外层函数没定义x→ 报错 - 外层函数定义了
x,但中间还有一层函数没用它 →nonlocal仍能跳过中间层,直接绑定到最外层那个x - 误把全局变量当外层局部变量用
nonlocal→ 错误,该用global - 不能同时用
global和nonlocal声明同一个变量
global 和 nonlocal 混用时变量名冲突怎么办?
它们互斥,且优先级固定:nonlocal 只找嵌套作用域,global 只找模块级。如果外层有同名变量,Python 不会自动帮你选,必须明确声明。
- 想改外层函数的
counter?用nonlocal counter - 想改模块级的
CONFIG?用global CONFIG - 外层函数和全局都有
data,又想改外层那个 → 必须确保外层确实定义了它,否则nonlocal data会失败 - 没有声明时,读取按 LEGB 自动查找;但一旦赋值,就必须提前声明,否则解释器无法判断你到底想绑哪一层
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










