A009.描述一下global和nonlocal
文章目录
问题: 描述一下 global 和 nonlocal
👇 点击展开/折叠 面试背诵模板(建议先背这个)
global 使用场景与代码示例
1 | x = 10 # 全局变量 |
nonlocal 使用场景与代码示例
1 | def outer(): |
global 与 nonlocal 的核心对比
| 维度 | global | nonlocal |
|---|---|---|
| 作用域 | 全局作用域(模块级) | 最近的外层函数(非全局) |
| 适用场景 | 函数内修改模块级变量 | 闭包或嵌套函数中修改外层变量 |
| 能否用于嵌套函数 | ✅ 可以,但指向全局 | ✅ 可以,指向最近的外层函数 |
| 能否在模块级使用 | ❌ 不允许(模块级无意义) | ❌ 不允许(无外层函数) |
| 声明位置 | 函数内部,在访问前声明 | 嵌套函数内部,在访问前声明 |
常见错误与陷阱
1 | # ❌ 错误1:nonlocal 用于全局变量 |
使用场景速览
| 场景 | 推荐方案 | 替代方案 |
|---|---|---|
| 修改模块级配置变量 | global |
将变量封装为类属性或模块属性 |
| 闭包中维护计数器 | nonlocal |
使用列表 [0] 或可变对象(hack) |
| 装饰器中保存状态 | nonlocal |
使用 functools.wraps 配合属性 |
| 全局单例初始化 | global |
改用模块级全局变量或类静态方法 |
与 globals() 和 locals() 的关系
globals()返回全局命名空间字典,通过globals()['x'] = 20等效于global x; x = 20,但不够优雅。locals()返回当前局部命名空间字典,但修改它通常不会影响实际变量(Python 优化),不推荐使用。global和nonlocal是编译期指令,影响变量的作用域解析规则,而globals()/locals()是运行时函数,用于动态访问命名空间。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LGQ的博客!