类变量属于类、被所有实例共享,存储在类的__dict__中;实例变量属于具体对象、各实例独立,存储在实例的__dict__中。可变类变量易导致数据污染,应避免。

类变量和实例变量在 Python 中容易混淆,关键区别在于:类变量属于类本身,被所有实例共享;实例变量属于具体对象,每个实例独立拥有。
类变量:定义在类中、方法外,所有实例共用一份
类变量在类定义时创建,存储在类的 __dict__ 中。只要没被实例遮盖,所有实例读取的都是同一个值。
常见写法:
- 直接在 class 下赋值,如
count = 0 - 修改类变量应通过类名操作(如
MyClass.count += 1),避免用实例名赋值(否则会意外创建同名实例变量) - 适合存常量、计数器、配置项等不随实例变化的数据
实例变量:在 __init__ 或其他方法中用 self. 创建,各实例独立
每次调用 __init__ 时,self.x = value 就为该实例新建一个属性,存在实例的 __dict__ 中,互不影响。
立即学习“Python免费学习笔记(深入)”;
注意点:
- 必须用
self.前缀,否则只是局部变量,函数结束就销毁 - 可在任意方法中动态添加,不限于
__init__ - 优先级高于同名类变量:访问
obj.attr时,先查实例__dict__,再查类__dict__
典型陷阱:误用可变类变量导致数据污染
当类变量是列表、字典等可变对象时,多个实例修改它会互相影响:
class BadExample:
items = [] # 类变量,可变!
def add(self, x):
self.items.append(x) # 所有实例共用这个列表
<p>a = BadExample()
b = BadExample()
a.add(1)
b.add(2)
print(a.items) # [1, 2] —— 不是预期的 [1]
正确做法:在 __init__ 中初始化为实例变量:
def __init__(self): self.items = []- 或使用不可变默认值(如
None),并在方法内判断后创建
怎么查变量归属?看 __dict__ 就清楚
打印实例和类的 __dict__ 能直观分辨:
-
print(obj.__dict__)显示该实例独有的变量 -
print(MyClass.__dict__)显示类变量和方法 - 如果某个属性在实例
__dict__中存在,就是实例变量;否则去类里找,就是类变量










