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执行的操作本质完全不同:
字典
x:修改共享对象的内部内容x = {}是类级别定义的可变对象(字典属于可变类型)。当你执行animal1.x['num'] = 14时,并没有给animal1创建新的实例变量x,只是通过实例引用到了类变量指向的那个字典对象,直接修改了它的内部元素。因为所有实例共享这个字典对象,所以animal2.x会同步看到变化。整数
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
相关产品推荐
相关产品推荐

