news 2026/8/20 20:01:19

python del的使用详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python del的使用详解

你想要全面掌握 Python 中del关键字的使用方法,包括它的核心本质、不同场景(删除变量、列表 / 字典元素、对象属性等)的语法、底层逻辑,以及和其他删除方式的区别、常见使用误区,从而正确且灵活地使用del


一、del的核心本质

del是 Python 的关键字(不是函数),其核心作用是:删除「引用关系」,而非直接删除对象本身。

Python 中一切皆对象,变量本质是「指向对象的引用」。当你执行del时,只是切断了变量 / 索引 / 属性与对象之间的引用链接:

  • 如果一个对象的引用计数变为 0(没有任何变量 / 引用指向它),Python 的垃圾回收(GC)机制才会自动回收这个对象,释放内存;
  • 如果对象还有其他引用(比如多个变量指向同一个对象),del仅删除当前引用,对象本身依然存在。

二、del的基础使用场景

1. 删除变量引用

语法

python

del 变量名 # 批量删除多个变量 del 变量名1, 变量名2, 变量名3
示例

python

# 单个变量 a = 10 # 变量a引用整数对象10 print(a) # 输出:10 del a # 删除变量a对10的引用 # print(a) # 报错:NameError: name 'a' is not defined # 批量删除 b = 20 c = "hello" del b, c # print(b) # 报错,c同理
关键说明

python

# 验证:del删除的是引用,而非对象 x = [1, 2, 3] y = x # y和x指向同一个列表对象 del x # 仅删除x的引用,y仍指向原对象 print(y) # 输出:[1, 2, 3](对象未被删除)

2. 删除列表的元素 / 切片

del可原地修改列表,删除指定索引的元素或切片范围的元素(无返回值)。

语法

python

# 删除单个元素(按索引) del 列表[索引] # 删除切片(按范围) del 列表[起始索引:结束索引] # 清空列表所有元素(保留列表对象) del 列表[:]
示例

python

# 1. 删除单个元素 nums = [10, 20, 30, 40] del nums[1] # 删除索引1的元素(20) print(nums) # 输出:[10, 30, 40] # 2. 删除切片 del nums[1:3] # 删除索引1到2的元素(30、40) print(nums) # 输出:[10] # 3. 清空列表(保留列表对象) nums = [1, 2, 3] del nums[:] print(nums) # 输出:[](列表对象还在,只是内容为空) # 4. 错误示例:删除不存在的索引 # del nums[5] # 报错:IndexError: list assignment index out of range

3. 删除字典的键值对

语法

python

del 字典[键名]
示例

python

user = {"name": "张三", "age": 20, "gender": "男"} # 删除指定键值对 del user["age"] print(user) # 输出:{'name': '张三', 'gender': '男'} # 安全删除:先判断键是否存在 if "height" in user: del user["height"] # 不会报错,因为height不存在时跳过 # 错误示例:删除不存在的键 # del user["height"] # 报错:KeyError: 'height'

4. 删除对象的属性

语法

python

del 对象.属性名
示例

python

class Person: def __init__(self, name, age): self.name = name self.age = age # 创建实例 p = Person("李四", 25) print(p.age) # 输出:25 # 删除实例属性 del p.age # print(p.age) # 报错:AttributeError: 'Person' object has no attribute 'age' # 错误示例:删除不存在的属性 # del p.gender # 报错:AttributeError: 'Person' object has no attribute 'gender'

5. 注意:不可变对象无法用del修改

元组(tuple)、字符串(str)、整数(int)等不可变对象,其结构无法修改,因此不能用del删除元素 / 切片:

python

# 元组不可变,报错 t = (1, 2, 3) # del t[0] # 报错:TypeError: 'tuple' object doesn't support item deletion # 字符串不可变,报错 s = "hello" # del s[1] # 报错:TypeError: 'str' object doesn't support item deletion

三、del与其他删除方式的对比

日常开发中,列表 / 字典还有pop()等删除方法,和del的核心区别如下:

方式核心特点返回值适用场景
del list[index]原地删除列表元素,仅删除引用无返回值仅需删除元素,不需要返回值
list.pop(index)原地删除列表元素,删除引用 + 返回被删元素返回被删元素需要获取被删除的元素
list.remove(value)按值删除列表元素(第一个匹配项)无返回值知道元素值,不知道索引时
del dict[key]原地删除字典键值对,仅删除引用无返回值仅需删除键值对,不需要返回值
dict.pop(key)原地删除字典键值对,删除引用 + 返回被删值返回被删值需要获取被删除的键对应的值
示例对比

python

# 列表:del vs pop nums = [1, 2, 3] del nums[1] # 无返回值,nums变为[1,3] nums = [1, 2, 3] val = nums.pop(1) # 返回被删值2,nums变为[1,3] print(val) # 输出:2 # 字典:del vs pop user = {"name": "张三", "age": 20} del user["age"] # 无返回值 user = {"name": "张三", "age": 20} age = user.pop("age") # 返回被删值20 print(age) # 输出:20

四、高级场景:del与析构方法__del__

Python 类中可定义__del__方法(析构方法),当对象的引用计数为 0、即将被垃圾回收时,会自动调用该方法。

注意:del 实例只是删除引用,只有当引用计数为 0 时,__del__才会执行;且__del__的执行时机不确定,不建议依赖它做资源释放(比如关闭文件、数据库连接,建议用with语句)。

示例

python

class FileHandler: def __init__(self, filename): self.filename = filename print(f"创建对象:{self.filename}") def __del__(self): print(f"对象被回收:{self.filename}") # 析构时执行 # 测试 fh = FileHandler("test.txt") del fh # 删除引用,此时fh的引用计数为0,触发__del__ # 输出: # 创建对象:test.txt # 对象被回收:test.txt

五、常见使用误区

  1. 误区 1:认为del直接删除对象 → 纠正:del仅删除引用,对象是否被删除取决于引用计数是否为 0;
  2. 误区 2del list[:]会删除列表对象 → 纠正:该操作仅清空列表内容,列表对象本身仍存在(可用del list删除列表变量的引用);
  3. 误区 3:依赖__del__做资源释放 → 纠正:__del__执行时机不确定,比如程序异常退出时可能不执行,建议用with/try-finally
  4. 误区 4:删除不可变对象的元素 → 纠正:tuple/str/int 等不可变对象无法用del修改元素,会报 TypeError。

总结

  1. del是关键字,核心作用是删除引用关系,而非直接删除对象,对象的回收由 Python 垃圾回收机制决定;
  2. del可删除变量、列表元素 / 切片、字典键值对、对象属性,支持批量删除,且仅能修改可变对象;
  3. del无返回值,与pop()的核心区别是:pop()会返回被删除的元素,del仅删除;
  4. 避免误区:不可变对象不能用del修改元素,不依赖__del__做资源释放。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 5:11:54

用TIGGERRAMDISK快速搭建开发测试环境

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个基于RAMDISK的快速原型系统,功能要求:1.支持常见开发环境模板(Web/数据库/编译器等) 2.一键保存/恢复环境快照 3.自动清理临时文件 4.资源占用监控…

作者头像 李华
网站建设 2026/8/18 12:44:21

ResNet18模型监控方案:云端集成Prometheus,开箱即用

ResNet18模型监控方案:云端集成Prometheus,开箱即用 1. 为什么需要监控ResNet18模型服务? 作为MLOps工程师,当你部署好ResNet18图像分类服务后,最头疼的问题就是:"我的模型服务现在运行得怎么样&…

作者头像 李华
网站建设 2026/8/16 10:47:21

如何用AI辅助调试内存泄漏?Valgrind与AI结合实践

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个AI辅助工具,能够自动解析Valgrind的内存检测报告,识别潜在的内存泄漏、非法内存访问等问题,并给出修复建议。工具应支持以下功能&#…

作者头像 李华
网站建设 2026/8/8 23:16:48

告别模型训练烦恼|AI万能分类器实现自定义标签智能分类

告别模型训练烦恼|AI万能分类器实现自定义标签智能分类 在传统文本分类任务中,开发者往往需要准备大量标注数据、设计复杂的训练流程,并反复调优模型参数。这一过程不仅耗时耗力,还对团队的数据积累和算法能力提出了较高要求。然而…

作者头像 李华
网站建设 2026/8/5 18:38:46

InvalidateRect函数详解:如何高效控制窗口重绘?

在Windows图形用户界面编程中,控制窗口何时以及如何重绘是保证界面流畅和高效的关键。InvalidateRect函数正是这一机制的核心,它并不立即绘制,而是标记一块区域为“脏”区域,通知系统在合适的时机(通常是消息队列空闲时…

作者头像 李华
网站建设 2026/8/16 11:31:51

掌握Selenium打开IE浏览器:覆盖企业自动化测试刚需

在企业自动化测试工作中,selenium打开ie浏览器仍然是一个不可回避的技术需求。虽然ie浏览器已逐渐被edge取代,但许多传统企业系统、政府网站和内部应用仍然依赖ie的特定渲染模式。掌握selenium操作ie的方法,意味着你能覆盖更全面的测试场景&a…

作者头像 李华