Python:类变量 vs 全局变量
一、定义 & 存放位置
全局变量
定义在函数、类外部,属于模块对象,保存在模块的__dict__。
g_val = 100 # 全局变量,模块级别 def test(): print(g_val)类变量
写在class内部、方法外面,属于类对象,保存在类的__dict__,所有实例共享同一份。
class Demo: cls_val = 200 # 类变量,类级别重点区分:
实例.xxx = 值,是创建实例变量,不会修改类变量!
d = Demo() d.cls_val = 999 print(Demo.cls_val) # 依然是200,类变量没变二、生命周期
- 全局变量模块被导入时创建;程序退出 / 模块卸载才销毁。整个模块生命周期内一直存在。
- 类变量执行
class定义语句、创建类对象的时候生成;类对象没有任何引用,被 GC 回收时销毁。
三、作用域 & 访问
全局变量
- 模块内任意地方可读;函数内部修改必须加
global,否则会新建局部变量
g = 1 def func(): global g g += 1类变量
- 访问方式:
类名.变量或者实例.变量(实例没有同名属性时,向上查找类变量) - 在类的方法里修改类变量:要用
类名.变量或者self.__class__.变量
class Demo: x = 1 def add(self): Demo.x += 1 # ✅ 修改类变量 # self.x +=1 # ❗ 会生成实例变量,不再访问类变量四、多线程(核心)
✅只读场景:两者都安全⚠️并发写场景:全都线程不安全!Python GIL 只保证单条字节码原子,x +=1是多条字节码,会丢失更新,都需要 Lock。
区别:
- 全局变量:模块全局共享,所有函数 / 线程都能随意读写,容易全局污染,调试麻烦。
- 类变量:仅限本类共享。多个不同类的类变量天然隔离,适合分组维护多组共享状态;推荐把锁、共享变量一起封装在类里。
五、查找速度(简单结论)
局部变量 > 类变量 > 全局变量
- 全局变量:需要查模块字典,查找链路更长,最慢。
- 类变量:访问
类.属性直接查类__dict__,略快于全局。
性能差距很小,绝大多数业务可以忽略;热点循环建议缓存到局部变量。
六、对比总表
表格
| 项目 | 全局变量 | 类变量 |
|---|---|---|
| 归属 | 模块对象 | 类对象 |
| 存储 | 模块__dict__ | 类__dict__ |
| 共享范围 | 整个模块所有代码 | 同一个类的所有实例 + 类本身 |
| 修改陷阱 | 函数内修改忘记global,变成局部变量 | 实例.属性=xxx,新增实例变量,不改类变量 |
| 生命周期 | 模块导入创建,程序结束销毁 | class 定义时创建,类无引用 GC 回收 |
| 多线程并发写 | 不安全,需要锁 | 不安全,需要锁 |
| 隔离性 | 差,容易全局污染 | 好,可以用多个类隔离多组状态 |
| 适用场景 | 少量简单全局配置 | 需要封装、分组共享状态 |
七、使用建议
- 尽量少用全局变量,状态分散、难维护,容易意外篡改。
- 需要跨实例共享数据:优先类变量,搭配锁、方法封装,内聚性更好。
- 如果每个实例自己单独数据:实例变量,而不是类变量。
- 热点循环读取:把全局 / 类变量先赋值给局部变量,提升速度。
八、什么时候选谁?
- ✅ 全局变量:程序常量、模块级别固定配置(只读)
- ✅ 类变量:实例之间需要共享计数器、共享连接池、mp.yklkk.top/blog/9kLm2QpX7a.html
mp.yklkk.top/blog/Zx4Tn8Vr1B.html
mp.yklkk.top/blog/Qw7Yh3Ns5D.html
mp.yklkk.top/blog/Mc2Jv9Kp6E.html
mp.yklkk.top/blog/Rt8Bn4Xz0F.html
mp.yklkk.top/blog/Hg5Lp1Wq7G.html
mp.yklkk.top/blog/Uv3Dm6Yr2H.html
mp.yklkk.top/blog/Pa9Kc4Nt8J.html
mp.yklkk.top/blog/Se2Qx7Vb5K.html
mp.yklkk.top/blog/Fn6Wm1Zp3L.html
mp.yklkk.top/blog/Yd4Hr9Cv2M.html
mp.yklkk.top/blog/Jk7Tq3Bs8N.html
mp.yklkk.top/blog/Ol1Pm5Xw6P.html
mp.yklkk.top/blog/Bg8Nc2Vr4Q.html
mp.yklkk.top/blog/Xm5Kt7Yd1R.html
mp.yklkk.top/blog/Cv9Qp3Ln6S.html
mp.yklkk.top/blog/Zr2Wm8Hx4T.html
mp.yklkk.top/blog/Nk6Jd1Vp9U.html
mp.yklkk.top/blog/Lq4Yt7Bc2V.html
mp.yklkk.top/blog/Wp8Rm3Nx5W.html
mp.yklkk.top/blog/Td1Kv6Qs9X.html
mp.yklkk.top/blog/Hx5Pm2Zr7Y.html
mp.yklkk.top/blog/Gc9Bn4Wt1Z.html
mp.yklkk.top/blog/Vr3Lq8Jd6A.html
mp.yklkk.top/blog/Mp7Yx2Kc5B.html
mp.yklkk.top/blog/Ks4Wm9Nv3C.html
mp.yklkk.top/blog/Qn1Rt6Bp8D.html
mp.yklkk.top/blog/Dz5Jv2Xm7E.html
mp.yklkk.top/blog/Sb9Lq4Hr1F.html
mp.yklkk.top/blog/Yt3Pm8Kx6G.html
mp.yklkk.top/blog/Rc7Wn1Vd4H.html
mp.yklkk.top/blog/Bp2Qx9Lm5J.html
mp.yklkk.top/blog/Nv6Tr3Yc8K.html
mp.yklkk.top/blog/Lm1Jd7Wp2L.html
mp.yklkk.top/blog/Xq5Kv9Bn4M.html
mp.yklkk.top/blog/Ct8Rm2Hx7N.html
mp.yklkk.top/blog/Zp3Yq6Ld1P.html
mp.yklkk.top/blog/Gv9Wm4Nc5Q.html
mp.yklkk.top/blog/Hk2Jx7Rt8R.html
mp.yklkk.top/blog/Md6Pq1Bv3S.html
mp.yklkk.top/blog/Tn8Lm5Wx2T.html
mp.yklkk.top/blog/Qr4Yp9Kc7U.html
mp.yklkk.top/blog/Vx1Jv6Nd3V.html
mp.yklkk.top/blog/Kp7Wm2Ht9W.html
mp.yklkk.top/blog/Bc5Rq8Lx4X.html
mp.yklkk.top/blog/Nm9Yd3Pv1Y.html
mp.yklkk.top/blog/Lt2Kx7Bc6Z.html
mp.yklkk.top/blog/Xv8Qm4Nr5A.html
mp.yklkk.top/blog/Cp1Jd9Wt3B.html
mp.yklkk.top/blog/Zk6Lq2Yx8C.html
mp.yklkk.top/blog/Gr3Pm7Vc1D.html
mp.yklkk.top/blog/Hx9Bn5Kd4E.html
mp.yklkk.top/blog/Mv2Tq8Lm6F.html
mp.yklkk.top/blog/Tc7Yp1Rx3G.html
mp.yklkk.top/blog/Qm4Jv9Wd5H.html
mp.yklkk.top/blog/Vp8Km2Nx7J.html
mp.yklkk.top/blog/Kd1Lq6Bt9K.html
mp.yklkk.top/blog/Bx5Rm3Yc2L.html
mp.yklkk.top/blog/Nq9Pv7Hd4M.html
mp.yklkk.top/blog/Lm3Jx1Wt6N.html
mp.yklkk.top/blog/Xc8Qm5Bv2P.html
mp.yklkk.top/blog/Cv4Kd9Nr7Q.html
mp.yklkk.top/blog/Zp1Yq6Lx3R.html
mp.yklkk.top/blog/Gt7Wm2Vc9S.html
mp.yklkk.top/blog/Hk5Jv8Rd1T.html
mp.yklkk.top/blog/Mx9Pq3Bn6U.html
mp.yklkk.top/blog/Tm2Ld7Wv4V.html
mp.yklkk.top/blog/Qc6Yp1Kx8W.html
mp.yklkk.top/blog/Vr3Jm9Nt5X.html
mp.yklkk.top/blog/Kp8Qv4Bd2Y.html
mp.yklkk.top/blog/Bm1Lx6Wc7Z.html
mp.yklkk.top/blog/Nv5Rd9Yp3A.html
mp.yklkk.top/blog/Lq2Km7Jx8B.html
mp.yklkk.top/blog/Xt9Pm4Vc1C.html
mp.yklkk.top/blog/Cd3Qv8Bn6D.html
mp.yklkk.top/blog/Zx7Lp2Yr5E.html
mp.yklkk.top/blog/Gm1Jd6Wv9F.html
mp.yklkk.top/blog/Hv4Kq9Nx2G.html
mp.yklkk.top/blog/Mp8Rm3Bc7H.html
mp.yklkk.top/blog/Tq1Yv5Ld4J.html
mp.yklkk.top/blog/Qx6Jm2Wt9K.html
mp.yklkk.top/blog/Vc3Pq7Rn1L.html
mp.yklkk.top/blog/Km9Ld4Bv6M.html
mp.yklkk.top/blog/Bp2Xv8Yc3N.html
mp.yklkk.top/blog/Nr5Qm1Jx7P.html
mp.yklkk.top/blog/Lv8Kd3Wt2Q.html
mp.yklkk.top/blog/Xm4Pq9Bc6R.html
mp.yklkk.top/blog/Ct1Rv7Lx5S.html
mp.yklkk.top/blog/Zp8Jm2Yd4T.html
mp.yklkk.top/blog/Gq3Kv6Nx9U.html
mp.yklkk.top/blog/Hm7Ld1Wc5V.html
mp.yklkk.top/blog/Mv4Pq8Bt2W.html
mp.yklkk.top/blog/Tr9Ym3Jx6X.html
mp.yklkk.top/blog/Qc2Kv7Ld1Y.html
mp.yklkk.top/blog/Vp6Rm4Nc8Z.html
mp.yklkk.top/blog/Kx1Jd9Wv3A.html
mp.yklkk.top/blog/Bm5Qq2Yt7B.html
mp.yklkk.top/blog/Nc8Lm4Hx1C.html
mp.yklkk.top/blog/Lv3Pq9Rd6D.html
mp.yklkk.top/blog/Xt7Km2Bc5E.html共享配置,并且希望封装在一起
要不要我给你一段极简示例代码,一次性演示:全局变量、类变量、实例变量三者行为对比?