关于Python中全局变量与类实例修改时global声明差异的疑问
Python全局变量与实例属性修改的差异解释
问题背景
你发现Python中两种场景存在看似矛盾的行为:
- 修改全局普通变量时,必须先通过
global声明才能修改变量本身 - 修改全局类实例的属性时,无需
global声明即可完成操作
示例1:修改全局普通变量
# python3 global_var = 10 def read_global_var(): print(global_var) # 无需global声明即可读取全局变量 def write_global_var(): global global_var # 修改前必须声明global global_var = 5 print(global_var) read_global_var() write_global_var() print(global_var)
示例2:修改全局实例的属性
# python3 class C: def __init__(self): self.x = 1.0 def read_global_instance(): print(global_instance.x) def write_global_instance(): # 此处无需global global_instance声明 global_instance.x = 3.0 global_instance = C() print(global_instance.x) read_global_instance() write_global_instance() print(global_instance.x)
核心原因解释
这两种场景本质完全不同:
- 修改全局普通变量:
global_var = 5是在重新绑定变量——让global_var这个名字指向一个新的对象(整数5)。如果没有global声明,Python会默认你是在函数内部创建一个新的局部变量,而非修改全局作用域的那个变量。 - 修改实例属性:
global_instance.x = 3.0并没有修改global_instance这个变量本身(它依然指向原来的C实例对象),只是在修改该对象内部的属性值。此时你只是读取了全局的global_instance变量(获取它指向的对象),然后对这个对象进行属性赋值——读取全局变量不需要global声明,所以这步操作完全合法。
简单总结:
- 当你要改变变量的指向(让变量名绑定新对象),需要
global声明 - 当你只是操作变量指向的对象内部数据,不需要
global声明——因为你根本没修改变量本身,只是使用了变量指向的对象
内容的提问来源于stack exchange,提问作者furynerd
相关产品推荐
相关产品推荐

