第十八篇:变量作用域(Local, Enclosing, Global, Built-in)与global、nonlocal关键字
在Python的编程宇宙中,变量如同星辰,散布在不同的空间维度。有些变量如流星般转瞬即逝(在函数内部),有些则如恒星般永恒闪耀(在全局范围)。你是否曾遭遇过这样的困惑:
- 在函数内部修改了一个“全局变量”,却发现外部的值纹丝不动?
- 在嵌套函数中想要更新外部函数的变量,却收到
UnboundLocalError
的报错?- 明明没有定义len函数,却可以直接使用,它从何而来?
今天,我们将深入Python的"空间法则"——变量作用域,彻底解析LEGB规则(Local, Enclosing, Global, Built-in)。这不仅是理解Python名字查找机制的核心,更是你从"代码写手"蜕变为"架构师"的必经之路。本文将用生动的比喻、清晰的图解和实战案例,带你征服global
和nonlocal
关键字,写出既安全又优雅的代码。
一、 开篇思考:一个令人困惑的变量修改问题
让我们从一个常见的场景开始,这个问题困扰过无数Python初学者:
count = 0 # 定义一个全局计数器def