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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:42:05