不需要加 global 就能修改全局可变对象内容(如 list.append、dict.update),但重新赋值(=、+= 对不可变类型等)必须加 global;global 仅适用于模块级变量,不作用于类或实例属性。

不需要加 global 关键字就能修改全局列表、字典等可变对象的内容,但只要涉及「重新赋值」(比如 =、+=、del、list = [...]),就必须加 global。
修改列表/字典内容(如 append、update)不需 global
因为这是「原地操作」,变量名仍绑定原来的对象,Python 不会创建新局部变量。
- 常见场景:在函数里往全局
items列表追加元素、清空字典、更新键值对 - 错误现象:没加
global却能正常运行,容易误以为「所有修改都不需要声明」 - 示例:
data = []<br>def add_item():<br> data.append("new") # ✅ 合法,不报错<br>add_item()<br>print(data) # ['new']
重新赋值(如 =、+=、切片赋值)必须加 global
Python 看到赋值语句,就默认该变量是局部的——哪怕同名全局变量已存在。不声明就会触发 UnboundLocalError 或静默创建局部副本。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 典型错误:
my_list = my_list[1:]、config = {"a": 1}、counter += 1(对不可变类型) - 注意:
+=对列表是原地扩展(不需global),但对整数/字符串是重绑定(需global) - 示例:
cache = {}<br>def reset_cache():<br> cache = {} # ❌ 创建局部变量,全局 cache 不变<br>reset_cache()正确写法:def reset_cache():<br> global cache<br> cache = {} # ✅ 修改全局变量
global 只作用于模块级变量,不适用于类属性或实例变量
global 的目标只能是定义在模块顶层的变量,不能用来修改 self.x 或 MyClass.attr。
- 常见误解:在类方法里写
global count想改类变量,结果发现不起作用 - 正确做法:类变量用
ClassName.attr访问,实例变量用self.attr,都不走global机制 - 如果真要改模块级计数器,确保它在文件最外层定义,且方法里明确
global count
最容易被忽略的是「同一变量混用两种操作」:比如先 items.append(x) 再 items = [],后者必须加 global items,否则前面的修改全白费——因为第二步创建了新的局部 items,和全局无关。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










