Python3.8中类变量与列表类变量的更新行为差异咨询
Python类变量实例操作差异的原因分析
先还原你场景中的类定义(补全关键逻辑):
class a: # 类变量 A = 6 list_a = [] # 实例变量初始化 def __init__(self, b, c): self.b = b self.c = c # 向list_a追加元素的方法 def print_all(self): self.list_a.append(5)
不可变类变量(如A)的操作逻辑
当你执行ABC.A = 10时,并没有修改类a的类变量A,而是给实例ABC自身创建了一个同名的实例变量。
之后访问ABC.A时,Python会优先读取实例自己的变量;而类a的A还是原来的6,两者已经完全分离。哪怕后续修改a.A = 20,ABC因为已经有了自己的实例变量A,也不会再去读取类的变量,所以ABC.A仍然是10。
同理,修改BBB.A = 17时,也是给BBB创建了专属的实例变量,和ABC的实例变量、类a的类变量互不影响。
可变类变量(如list_a)的操作逻辑
列表是可变类型,当你调用ABC.print_all()执行self.list_a.append(5)时,并没有给ABC创建新的实例变量,而是通过self.list_a找到了类a的类变量list_a(因为实例本身没有这个变量),然后直接修改了这个列表对象的内容。
由于类变量list_a指向的是同一个列表对象,类a、实例ABC、实例BBB在访问list_a时,都是引用这个对象,所以任何对该对象的修改都会同步反映到所有引用处。
只有当你执行类似ABC.list_a = [1,2,3]这种直接赋值操作时,才会给ABC创建自己的实例变量list_a,此时它才会和类的list_a分离。
核心总结
- 不可变类型(int、str、tuple等)的类变量:通过实例赋值时会创建实例专属变量,与类变量彻底分离。
- 可变类型(list、dict、set等)的类变量:调用对象方法修改内容时,操作的是类变量指向的原对象,所有引用同步变化;只有直接赋值时才会创建实例专属变量。
内容的提问来源于stack exchange,提问作者shivakumar
相关产品推荐
相关产品推荐

