news 2026/4/18 17:16:30

类变量和实例变量的生命周期分别是怎样的?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
类变量和实例变量的生命周期分别是怎样的?

类变量和实例变量的生命周期核心差异在于归属主体的创建 / 销毁时机:类变量随 “类” 的加载而生、随 “类” 的销毁而灭;实例变量随 “实例” 的创建而生、随 “实例” 的回收而灭。下面结合 Python 内存管理机制,分维度讲透生命周期,并附实操例子验证。

一、类变量的生命周期(类级生命周期)

类变量是类对象的属性,其生命周期完全绑定到 “类” 本身,而非类的实例。

1. 诞生时机:类定义被解释器执行时

当 Python 解释器执行到class 类名:代码块时,会先创建该类的 “类对象”(存储在内存的类命名空间中),同时初始化类变量并绑定到这个类对象上 —— 此时还未创建任何实例,类变量就已存在。

2. 存活阶段:类对象存在的整个周期

类变量创建后,只要类对象未被销毁,就一直存在于内存中:

  • 可通过类名.类变量全局访问 / 修改(哪怕没有任何实例);
  • 所有后续创建的实例,都能共享这个类变量(本质是实例从类对象中 “读取” 该属性);
  • 即使所有实例都被销毁,类变量依然存在(因为它属于类,而非实例)。
3. 销毁时机:类对象被垃圾回收 / 程序结束时

类变量的销毁分两种场景:

  • 正常场景:Python 程序运行结束时,解释器回收所有内存,类对象被销毁,类变量随之消失;
  • 特殊场景:主动删除类对象(如del 类名),或类对象失去所有引用(如在函数内定义的类,函数执行完后无外部引用),触发垃圾回收(GC),类变量被销毁。
类变量生命周期示例

python

运行

# 验证:类定义执行时,类变量已创建(无实例也能访问) class Student: school = "北京大学" # 类定义执行时,类变量诞生 # 无任何实例,仍能访问类变量(证明类变量已存在) print(Student.school) # 输出:北京大学 # 创建实例后,共享类变量 stu1 = Student() print(stu1.school) # 输出:北京大学 # 销毁所有实例(stu1被回收) del stu1 # 实例已销毁,但类变量仍存在 print(Student.school) # 输出:北京大学(类变量未随实例销毁) # 主动销毁类对象(触发类变量销毁) del Student # print(Student.school) # 报错:NameError: name 'Student' is not defined(类变量已消失)

二、实例变量的生命周期(实例级生命周期)

实例变量是实例对象的属性,其生命周期完全绑定到 “实例” 本身,与类无关。

1. 诞生时机:实例被创建(__init__执行时)

当执行实例名 = 类名()时,Python 会先创建空的实例对象,再调用类的__init__方法初始化实例 —— 实例变量(self.变量名)在__init__方法执行时被赋值,正式绑定到该实例对象上,此时实例变量才诞生。

2. 存活阶段:实例对象存在的整个周期

实例变量创建后,仅在所属实例的生命周期内存在:

  • 只能通过实例名.实例变量访问(类名无法直接访问,因为它不属于类);
  • 每个实例的实例变量相互独立(A 实例的变量修改,不影响 B 实例);
  • 实例变量的存活与类无关(哪怕类还存在,只要实例被销毁,其变量就消失)。
3. 销毁时机:实例对象被垃圾回收时

实例变量随实例的销毁而销毁,触发实例销毁的场景包括:

  • 实例对象失去所有引用(如del 实例名、实例变量被重新赋值);
  • 实例超出作用域(如函数内创建的实例,函数执行完后无外部引用);
  • 程序结束时,所有实例被批量回收。

Python 的垃圾回收机制会自动检测 “无引用的实例对象”,并回收其内存,实例变量也随之被销毁。

实例变量生命周期示例

python

运行

class Student: def __init__(self, name): self.name = name # 实例创建时,实例变量name诞生 # 1. 创建实例 → 实例变量诞生 stu1 = Student("张三") print(stu1.name) # 输出:张三(实例变量存在) # 2. 销毁实例 → 实例变量消失 del stu1 # 解除stu1对实例对象的引用,实例被GC回收 # print(stu1.name) # 报错:NameError: name 'stu1' is not defined # 验证:不同实例的变量独立,生命周期互不影响 stu2 = Student("李四") stu3 = Student("王五") print(stu2.name) # 输出:李四 del stu3 # 销毁stu3,仅stu3的name消失 print(stu2.name) # 输出:李四(stu2的实例变量不受影响)

三、生命周期核心对比表

维度类变量实例变量
诞生时机类定义被解释器执行时(无实例也存在)实例创建时(__init__执行时)
存活依赖依赖类对象的存在依赖所属实例对象的存在
销毁触发条件类对象被回收 / 程序结束实例对象被回收(无引用)/ 程序结束
与实例的关系不依赖实例(实例销毁,类变量仍在)完全依赖实例(实例销毁,变量消失)
作用范围全局(类存在则可访问)仅所属实例(实例内可访问)

四、关键补充:容易混淆的细节

  1. “实例遮蔽类变量” 不影响类变量生命周期当执行实例名.类变量名 = 新值时,本质是给实例新增一个同名实例变量,这个实例变量的生命周期遵循 “实例级规则”,但原类变量的生命周期不受影响(仍随类存在)。

    python

    运行

    class Student: school = "北大" # 类变量(生命周期绑定类) stu = Student() stu.school = "复旦" # 新增实例变量school(生命周期绑定stu) del stu # 实例变量school被销毁 print(Student.school) # 类变量仍存在,输出:北大
  2. 类变量的 “修改” 不改变生命周期无论是通过类名.类变量 = 新值修改类变量,还是通过self.__class__.类变量修改,都只是改变类变量的值,不会改变其生命周期(依然随类的创建 / 销毁而变化)。

  3. 模块级类 vs 函数内类的生命周期差异

    • 模块级定义的类:程序运行期间始终存在,类变量直到程序结束才销毁;
    • 函数内定义的类:函数执行时创建类对象,函数执行完后若类无外部引用,类对象被回收,类变量随之销毁。

总结

  • 类变量:“生” 在类定义执行时,“活” 在类存在的全周期,“死” 在类被回收 / 程序结束时(与实例无关);
  • 实例变量:“生” 在实例创建(__init__执行)时,“活” 在实例存在的周期,“死” 在实例被回收时(与类无关)。

一句话记:类变量跟类走,实例变量跟实例走

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:24:02

社群运营手册:建立活跃的LobeChat用户群

社群运营手册:建立活跃的LobeChat用户群 在AI助手逐渐成为数字生活标配的今天,一个功能强大又易于使用的交互界面,往往决定了用户是否愿意留下来。对于技术社群而言,面对成员频繁提问、知识分散、运维人力有限等现实挑战&#xff…

作者头像 李华
网站建设 2026/4/17 22:35:55

NVIDIA隐藏设置实战:性能调优的终极指南

NVIDIA隐藏设置实战:性能调优的终极指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector作为一款深度挖掘显卡潜力的工具,能够解锁官方控制面板中无法访…

作者头像 李华
网站建设 2026/4/18 5:25:47

终极Mac软件管理神器:Applite让Homebrew图形化操作变得如此简单

还在为复杂的终端命令而头疼吗?每次安装软件都要打开终端,输入一长串记不住的命令,安装完成还要手动清理,这样的体验实在让人烦恼。Applite的出现彻底改变了这一切,这款基于Homebrew Casks的开源工具通过直观的图形界面…

作者头像 李华
网站建设 2026/4/18 2:44:52

系统编程中线程

一、线程的定义与作用定义:线程是轻量级的进程,线程属于某个进程。作用:并发,和进程相同。相对比较耗时的任务。特征:1.进程是系统中最小的资源分配单位。2.线程是系统最小的执行单位。3.进程中,线程与线程…

作者头像 李华
网站建设 2026/4/18 2:38:34

BetterNCM 安装器完整使用指南:从零开始掌握插件管理

BetterNCM 安装器完整使用指南:从零开始掌握插件管理 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否曾经对网易云音乐的插件安装感到困惑?面对各种安装失…

作者头像 李华
网站建设 2026/4/17 18:19:53

Java异常学习笔记:异常处理、抛出和自定义

什么是异常,程序在编译过程中,可能因为标点遗漏等语法错误,导致编译阶段就报错。 但是很多时候,代码能编译通过,在实际运行时,可能因为“内存满了”、“程序调用参数有问题”、“文件不存在”等各种原因&a…

作者头像 李华