标题对于一个列表 x = [1, 2, 4, 5, 8, 9, 4] , 大家来想一想列表的删除方法有哪些呢?
- 本博客分别从
del x[:]
、remove()
和pop()
来说起!!
1. 首先大家就能想到的就是:del
, 因为 删除
的英文就是 delete
x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 删除 2 试一试,是索引 2 对应的元素呢,还是就是数字 2 ?
del x[2]
# 再次打印地址试试
print(id(x))
# 打印此时的列表 x
print(x)
运行结果如下:
140174853529224
140174853529224
[1, 2, 5, 8, 9, 4]
- 大家发现, 地址没有变化, 说明
del x[2]
的操作并没有重新创建对象(PS: Python 中,一切皆对象!!), 细心的小伙伴们也发现了,del x[2]
的操作并不是删除列表中的数字 2 ,而是列表索引 2 对应的数字 4。 - 地址没有发生变化, 说明
del x[2]
是原地操作 , 没有听过的小伙伴们可能会蒙圈。
好奇的小伙伴又问了,如果删除的索引不存在,程序会发生什么呢?
下面我们根据实例,看看会有哪些情况
x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 删除的是不是 9 呢?
del x[9]
# 再次打印地址试试
print(id(x))
# 打印此时的列表 x
print(x)
运行结果如下:
IndexError: list assignment index out of range
- 这里程序提示报错了:意思是列表访问索引超出的范围,因为这篇文章 x 的列表就 7 个元素,索引是从 0 开始的那么索引最多到 6
# 索引 0 1 2 3 4 5 6 # 这是正向索引:正向递增
x = [1, 2, 4, 5, 8, 9, 4]
# -7 -6 -5 -4 -3 -2 -1 # 这是反向索引:负向递减
del
就这一种方法嘛 ~ ,还有没有其他方法呢?
del
还可以删除整个列表哦 ~ 一起来动动手吧!
x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 删除整个列表
del x
# 再次打印地址试试
print(id(x))
print(x)
运行结果如下:
140174853849224
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-221-785a7e852cc8> in <module>
4 del x
5 # 再次打印地址试试
----> 6 print(id(x))
NameError: name 'x' is not defined
- 我们发现程序报错的,错在第 6 行,
NameError: name 'x' is not defined
,程序它说:亲 ~ ,您刚刚删了已经把我从这个世界上 湮灭 了 (就像是复联中的灭霸,弹指灰飞烟灭~),怎么可能找到我的家(id(x)
)呢?? - 没错 , 此时
del x
操作已经删除了整个列表 ,程序已经找不到了。
这时就会有小伙伴们问了 ,是不是该介绍介绍 remove()
方法了呢 ?
del x[:]
站出来不愿意了,大喊,劳资还有功能呢,其他人闪开!
del x[start:stop]
还可以删除指定的 区域 ,例如:
x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 删除 索引 2 到索引 4 ?还是 ?
del x[2:4]
# 再次打印地址试试
print(id(x))
print(x)
运行结果如下:
140174855737032
140174855737032
[1, 2, 8, 9, 4]
- 细心的小伙伴们会发现,
del x[2:5]
的操作并不是删除是删除索引 2、3 对应的元素,有小伙伴就问了,不对,还有索引 4 呢。我们看:
# 索引 0 1 2 3 4 5 6 # 这是正向索引:正向递增
x = [1, 2, 4, 5, 8, 9, 4]
# -7 -6 -5 -4 -3 -2 -1 # 这是反向索引:负向递减
-
索引这部分是个好知识点, 包括
range()
、 字符串的slice
(切片等等都会涉及到,后面会一 一讲解。) -
del x[2:5]
果然删除的是 2 ,3 索引的元素(数字 4 和 5),小伙伴们又发现了, 没有包括索引 4 ,这里就可以小结一下了:一般的[start:stop]
是左闭右开的
start
:索引开始的位置 (包含)
stop
: 索引结束的位置 (不包含) -
当然,如果删除的索引也超出了范围,程序是否也会报错呢?
下面我们根据实例,看看会有哪些情况
x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
del x[2:9]
# 再次打印地址试试
print(id(x))
# 打印此时的列表 x
print(x)
运行结果如下:
140174854780872
140174854780872
[1, 2]
- 大家发现如果索引结束位置超出了列表长度,程序不但没有报错,反而打印了剩余列表,这是为什么呢?
- 可能是因为列表会默认 删除 开始索引位置 到索引末端
# 索引 0 1 # 这是正向索引:正向递增
x = [1, 2]
# -2 -1 # 这是反向索引:负向递减
到这里,基本就讲完了 del
的用法
2. 下面我们来介绍一下 x.remove()
的方法吧 ~~
先上代码:
x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 删除所有的 4 ,还是?
x.remove(4)
# 再次打印地址试试
print(id(x))
print(x)
运行结果如下:
140174908666248
140174908666248
[1, 2, 5, 8, 9, 4]
- 大家会发现 :第一个数字 4 没有了, 说明用
x.remove(4)
方法删除了, 小伙伴们一起来和我想一想,remove()
括号里的参数是 —— 非常棒, 就是 待删除的元素 ,而不是按照索引删除的。 - 大家还能发现,
remove()
方法对列表进行删除操作和del
删除操作一样,相同点 都是原地修改,不同点del
是按照索引删除的,而remove
是直接删除的是第一次出现的元素。 - 同理,
remove()
方法删除的元素不存在,是否会报错呢?
x.remove(7)
print(x)
运行结果如下:
ValueError: list.remove(x): x not in list
- 程序报错,说
x
元素不在列表中 (这里的x
指的是7
)
当然你什么都不放,程序也会生气气~:
x.remove()
运行结果如下:
TypeError: remove() takes exactly one argument (0 given)
- 程序说:哼,明明应该给我一颗糖糖,如今什么都不给 ,生气啦生气啦~
3. 最后,我们一起来看一下 x.pop()
的用法吧 ~~
x = [1, 2, 4, 5, 8, 9, 4]
print(id(x))
# 没有参数,会不会报错 ?
x.pop()
# 再次打印地址试试
print(id(x))
print(x)
- 这时小伙伴就问了,唉,小白,你什么参数都没传进去,程序要报错啊!!
- 真的是这样吗?
运行结果如下:
140174854446280
140174854446280
[1, 2, 4, 5, 8, 9]
- 聪明的小伙伴们擦亮眼睛看看哪一个元素少了?
- 这时有小伙伴就开始抢答了,最后一个数字没有了 ! 细心的小伙伴也发现了,
pop()
也是原地修改 - 于是就有小伙伴问了,咦,小白,那你说的这删除方法和
remove()
一样啊,没有啥区别啊。 - 别急,重点来了
x = [1, 2, 4, 5, 8, 9, 4]
print(x.pop())
print(x)
运行结果如下:
4
[1, 2, 4, 5, 8, 9]
- 大家会发现,这个删掉的元素 4 又被
x.pop()
抛出来了
那如果传入参数呢?
x = [1, 2, 4, 5, 8, 9, 4]
print(x.pop(4))
print(x)
- 想一下
x.pop(4)
删的是索引对应的元素,还是就是删除的是数字 4 ?
运行结果如下:
8
[1, 2, 4, 5, 9, 4]
- 看来啊,
x.pop(4)
方法删除的是指定索引的元素,即 数字 8
那如果打印 x.remove(7)
这个呢 ?
x = [1, 2, 4, 5, 8, 9, 4]
print(x.remove(5))
print(x)
运行结果如下:
None
[1, 2, 4, 8, 9, 4]
- 返回值为
None
文字小结:
- 由此就可以小结一下,
x.pop()
方法是删除某个元素并抛出,x.remove()
是悄悄的删。 - 可以做这样一个类比
x.pop()
是光明正大的删,大喊我把某个东西偷了,并且还亮了出来到处炫耀。而x.remove()
是偷偷的删人家还不知道(None
),默默无闻。
表格小结:
方法 | del x | del x[:] | x.remove() | x.pop() |
---|---|---|---|---|
删除原则 | 整体删除 | 按索引 | 按元素 | 按索引 |
修改方式 | 地址“消失” | 原地修改 | 原地修改 | 原地修改 |
若元素不存在 | —— | —— | 报错 | —— |
若索引不存在 | —— | —— | —— | 报错 |
不传参数 | —— | 清空列表元素 | 报错 | 默认删除末尾 |
返回值 | —— | 返回 [ ] | None | 返回删除的元素 |
传参数 | 彻底删除列表 | 删除指定区间,若超出,默认删除至末尾 | 删除第一次指定的元素 | 按索引删除并返回 |
返回值 | —— | —— | None | 返回删除的元素 |