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

Python类变量与实例变量:为何字典与int表现存在差异?

问题场景

测试代码

class Animal:
    x = {}
    y = 0
    def __init__(self):
        pass


animal1 = Animal()
animal2 = Animal()

animal1.x['num'] = 14
animal1.y = 14

print(animal2.x)
print(animal2.y)

输出结果

{'num': 14}

0

疑问

作为Python面向对象编程新手,我测试时发现:修改类变量字典x的元素后,另一个实例animal2的x也变化;给animal1的y赋值14后,animal2的y仍为0。为何字典被类变量共享,int却成为实例独有变量?我原预期两者均不变。


问题解析

核心逻辑:可变/不可变对象的操作差异

Python中类变量默认由所有实例共享,但你对x和y执行的操作本质完全不同:

  1. 字典x:修改共享对象的内部内容
    x = {}是类级别定义的可变对象(字典属于可变类型)。当你执行animal1.x['num'] = 14时,并没有给animal1创建新的实例变量x,只是通过实例引用到了类变量指向的那个字典对象,直接修改了它的内部元素。因为所有实例共享这个字典对象,所以animal2.x会同步看到变化。

  2. 整数y:创建实例变量覆盖类变量
    y = 0是类级别定义的不可变对象(整数属于不可变类型)。当你执行animal1.y = 14时,由于整数无法被修改,Python会直接在animal1的实例命名空间里创建一个新的实例变量y,它会覆盖对类变量y的引用。此时animal1使用的是自己的实例变量y,而animal2依然引用类变量y,因此两者值不同。

验证实例变量的存在

可以通过__dict__属性查看实例的专属变量:

print(animal1.__dict__)  # 输出: {'y': 14},说明animal1有自己的y,x仍指向类变量
print(animal2.__dict__)  # 输出: {},说明animal2无专属变量,所有属性取类变量

让字典成为实例独有

如果想让每个实例拥有独立的字典x,需要在__init__中初始化实例变量:

class Animal:
    def __init__(self):
        self.x = {}  # 每个实例创建时生成新的字典
        self.y = 0

animal1 = Animal()
animal2 = Animal()
animal1.x['num'] = 14
animal1.y = 14
print(animal2.x)  # 输出: {}
print(animal2.y)  # 输出: 0

内容的提问来源于stack exchange,提问作者Michael Ojoko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:07:14