YAOTU INSIGHTS

类变量和全局变量的生命周期有什么区别?

类变量和全局变量的生命周期有什么区别?
Python类变量 vs 全局变量 — 生命周期区别核心一句话全局变量依附模块类变量依附类对象。谁的宿主活着变量就活着宿主被 GC 回收变量跟着销毁。一、全局变量全局变量定义在模块顶层保存在模块对象的__dict__。创建时机模块被第一次导入import的时候执行模块代码创建全局变量。存活期间模块一旦导入成功模块对象会一直驻留内存放到sys.modules缓存。 只要进程没结束模块就不会被回收全局变量一直存在。即使你不再使用模块里的函数模块对象依然在sys.modules全局变量保留。销毁时机正常情况程序进程退出时才销毁极少数场景手动从sys.modules删除模块引用 无任何其他引用才会 GC 回收模块全局变量随之释放实际开发极少这么做特点生命周期很长几乎贯穿整个程序运行期。二、类变量类变量写在class内部、方法之外保存在类对象的__dict__。创建时机执行class定义语句那一刻Python 会创建类对象同时生成类变量。class A: x 10 # 执行class这一行就创建类变量x存活期间只要类对象还有引用类变量就存在。 引用来源可以是类名本身A类的实例其他地方保存的类引用销毁时机当类对象所有引用全部消失GC 把类对象回收类变量跟着一起销毁。如果这个类一直被引用比如全局作用域定义的类类变量就和全局变量一样活到程序结束如果函数内部动态定义 class函数执行完没有外部引用类对象就会被 GC类变量直接释放。示例def create_class(): class Temp: val 99 return Temp() obj create_class() # 只要obj还在Temp类对象就存在Temp.val类变量存活 del obj # obj删除后如果没有任何地方引用Temp类类对象被GCval销毁三、关键差异点宿主不同全局变量宿主是模块对象模块一旦缓存进 sys.modules 很难回收。类变量宿主是类对象类对象满足无引用条件就可以 GC。生命周期灵活性全局变量一旦导入基本常驻内存很难主动释放。类变量可以随类对象销毁而释放。动态创建的类用完即可回收内存可以释放。定义位置带来的常见现象很多类写在模块顶层这时类对象本身就是全局的类变量也会活到程序结束看起来生命周期和全局变量一样。这是很多人容易混淆的点不是类变量天生短命是看类对象的引用是否还存在。实例删除不影响类变量就算所有实例全部 del只要类本身还在类变量依然存活。class A: x 1 a1 A() del a1 print(A.x) # 仍然存在类对象A还在四、对比表表格项目全局变量类变量归属宿主模块对象类对象创建时机模块第一次 import执行模块代码执行class定义语句时创建销毁条件模块从 sys.modules 移除 无引用一般进程结束销毁类对象全部引用消失GC 回收类对象类变量销毁是否可主动回收很难模块会被 sys.modules 缓存可以解除类的所有引用即可被 GC实例删除影响无关删除实例只要类还在类变量不变典型生命周期几乎贯穿整个程序可长可短顶层定义类则常驻动态类用完可回收五、简单总结模块顶层定义的全局变量程序启动导入后一直存活直到程序退出。类变量的生命周期绑定类对象类在模块顶层定义 → 类常驻类变量常驻动态创建局部类 → 引用消失mp.ma-xy.com/blog/9kLm2QpX7a.htmlmp.ma-xy.com/blog/Zx4Tn8Vr1B.htmlmp.ma-xy.com/blog/Qw7Yh3Ns5D.htmlmp.ma-xy.com/blog/Mc2Jv9Kp6E.htmlmp.ma-xy.com/blog/Rt8Bn4Xz0F.htmlmp.ma-xy.com/blog/Hg5Lp1Wq7G.htmlmp.ma-xy.com/blog/Uv3Dm6Yr2H.htmlmp.ma-xy.com/blog/Pa9Kc4Nt8J.htmlmp.ma-xy.com/blog/Se2Qx7Vb5K.htmlmp.ma-xy.com/blog/Fn6Wm1Zp3L.htmlmp.ma-xy.com/blog/Yd4Hr9Cv2M.htmlmp.ma-xy.com/blog/Jk7Tq3Bs8N.htmlmp.ma-xy.com/blog/Ol1Pm5Xw6P.htmlmp.ma-xy.com/blog/Bg8Nc2Vr4Q.htmlmp.ma-xy.com/blog/Xm5Kt7Yd1R.htmlmp.ma-xy.com/blog/Cv9Qp3Ln6S.htmlmp.ma-xy.com/blog/Zr2Wm8Hx4T.htmlmp.ma-xy.com/blog/Nk6Jd1Vp9U.htmlmp.ma-xy.com/blog/Lq4Yt7Bc2V.htmlmp.ma-xy.com/blog/Wp8Rm3Nx5W.htmlmp.ma-xy.com/blog/Td1Kv6Qs9X.htmlmp.ma-xy.com/blog/Hx5Pm2Zr7Y.htmlmp.ma-xy.com/blog/Gc9Bn4Wt1Z.htmlmp.ma-xy.com/blog/Vr3Lq8Jd6A.htmlmp.ma-xy.com/blog/Mp7Yx2Kc5B.htmlmp.ma-xy.com/blog/Ks4Wm9Nv3C.htmlmp.ma-xy.com/blog/Qn1Rt6Bp8D.htmlmp.ma-xy.com/blog/Dz5Jv2Xm7E.htmlmp.ma-xy.com/blog/Sb9Lq4Hr1F.htmlmp.ma-xy.com/blog/Yt3Pm8Kx6G.htmlmp.ma-xy.com/blog/Rc7Wn1Vd4H.htmlmp.ma-xy.com/blog/Bp2Qx9Lm5J.htmlmp.ma-xy.com/blog/Nv6Tr3Yc8K.htmlmp.ma-xy.com/blog/Lm1Jd7Wp2L.htmlmp.ma-xy.com/blog/Xq5Kv9Bn4M.htmlmp.ma-xy.com/blog/Ct8Rm2Hx7N.htmlmp.ma-xy.com/blog/Zp3Yq6Ld1P.htmlmp.ma-xy.com/blog/Gv9Wm4Nc5Q.htmlmp.ma-xy.com/blog/Hk2Jx7Rt8R.htmlmp.ma-xy.com/blog/Md6Pq1Bv3S.htmlmp.ma-xy.com/blog/Tn8Lm5Wx2T.htmlmp.ma-xy.com/blog/Qr4Yp9Kc7U.htmlmp.ma-xy.com/blog/Vx1Jv6Nd3V.htmlmp.ma-xy.com/blog/Kp7Wm2Ht9W.htmlmp.ma-xy.com/blog/Bc5Rq8Lx4X.htmlmp.ma-xy.com/blog/Nm9Yd3Pv1Y.htmlmp.ma-xy.com/blog/Lt2Kx7Bc6Z.htmlmp.ma-xy.com/blog/Xv8Qm4Nr5A.htmlmp.ma-xy.com/blog/Cp1Jd9Wt3B.htmlmp.ma-xy.com/blog/Zk6Lq2Yx8C.htmlmp.ma-xy.com/blog/Gr3Pm7Vc1D.htmlmp.ma-xy.com/blog/Hx9Bn5Kd4E.htmlmp.ma-xy.com/blog/Mv2Tq8Lm6F.htmlmp.ma-xy.com/blog/Tc7Yp1Rx3G.htmlmp.ma-xy.com/blog/Qm4Jv9Wd5H.htmlmp.ma-xy.com/blog/Vp8Km2Nx7J.htmlmp.ma-xy.com/blog/Kd1Lq6Bt9K.htmlmp.ma-xy.com/blog/Bx5Rm3Yc2L.htmlmp.ma-xy.com/blog/Nq9Pv7Hd4M.htmlmp.ma-xy.com/blog/Lm3Jx1Wt6N.htmlmp.ma-xy.com/blog/Xc8Qm5Bv2P.htmlmp.ma-xy.com/blog/Cv4Kd9Nr7Q.htmlmp.ma-xy.com/blog/Zp1Yq6Lx3R.htmlmp.ma-xy.com/blog/Gt7Wm2Vc9S.htmlmp.ma-xy.com/blog/Hk5Jv8Rd1T.htmlmp.ma-xy.com/blog/Mx9Pq3Bn6U.htmlmp.ma-xy.com/blog/Tm2Ld7Wv4V.htmlmp.ma-xy.com/blog/Qc6Yp1Kx8W.htmlmp.ma-xy.com/blog/Vr3Jm9Nt5X.htmlmp.ma-xy.com/blog/Kp8Qv4Bd2Y.htmlmp.ma-xy.com/blog/Bm1Lx6Wc7Z.htmlmp.ma-xy.com/blog/Nv5Rd9Yp3A.htmlmp.ma-xy.com/blog/Lq2Km7Jx8B.htmlmp.ma-xy.com/blog/Xt9Pm4Vc1C.htmlmp.ma-xy.com/blog/Cd3Qv8Bn6D.htmlmp.ma-xy.com/blog/Zx7Lp2Yr5E.htmlmp.ma-xy.com/blog/Gm1Jd6Wv9F.htmlmp.ma-xy.com/blog/Hv4Kq9Nx2G.htmlmp.ma-xy.com/blog/Mp8Rm3Bc7H.htmlmp.ma-xy.com/blog/Tq1Yv5Ld4J.htmlmp.ma-xy.com/blog/Qx6Jm2Wt9K.htmlmp.ma-xy.com/blog/Vc3Pq7Rn1L.htmlmp.ma-xy.com/blog/Km9Ld4Bv6M.htmlmp.ma-xy.com/blog/Bp2Xv8Yc3N.htmlmp.ma-xy.com/blog/Nr5Qm1Jx7P.htmlmp.ma-xy.com/blog/Lv8Kd3Wt2Q.htmlmp.ma-xy.com/blog/Xm4Pq9Bc6R.htmlmp.ma-xy.com/blog/Ct1Rv7Lx5S.htmlmp.ma-xy.com/blog/Zp8Jm2Yd4T.htmlmp.ma-xy.com/blog/Gq3Kv6Nx9U.htmlmp.ma-xy.com/blog/Hm7Ld1Wc5V.htmlmp.ma-xy.com/blog/Mv4Pq8Bt2W.htmlmp.ma-xy.com/blog/Tr9Ym3Jx6X.htmlmp.ma-xy.com/blog/Qc2Kv7Ld1Y.htmlmp.ma-xy.com/blog/Vp6Rm4Nc8Z.htmlmp.ma-xy.com/blog/Kx1Jd9Wv3A.htmlmp.ma-xy.com/blog/Bm5Qq2Yt7B.htmlmp.ma-xy.com/blog/Nc8Lm4Hx1C.htmlmp.ma-xy.com/blog/Lv3Pq9Rd6D.htmlmp.ma-xy.com/blog/Xt7Km2Bc5E.html类连同类变量一起被 GC 回收。如果你想我可以用代码配合gc模块演示看类对象什么时候被垃圾回收。