You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Python中全局变量与类实例修改时global声明差异的疑问

Python全局变量与实例属性修改的差异解释

问题背景

你发现Python中两种场景存在看似矛盾的行为:

  1. 修改全局普通变量时,必须先通过global声明才能修改变量本身
  2. 修改全局类实例的属性时,无需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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:05:56