删除Python中列表的第一个元素

2024-03-29 00:10:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道,如果我想删除Python中列表t的第一个元素,我可以使用:

del t[0]

这是最直接的。但是:

t = t[1:]

同样有效。在我正在学习的教科书中,使用后一种方法通常被认为是不好的做法,因为它并没有删除列表的标题本身,但是

“slice操作符创建一个新列表,赋值使t引用它,但是没有一个 对作为参数传递的列表有任何影响。”

为什么这么糟?你能举出一个这样的方法会显著改变函数的例子吗?提前谢谢。


Tags: 方法函数元素标题列表slice例子赋值
3条回答

这不是个好主意有多种原因:

  • 创建一个新列表只会使创建新列表和释放旧列表成为不必要的工作。在这两个步骤之间,使用两倍的内存(因为原始列表和新列表在赋值之前同时处于活动状态)。

  • 如果其他内容引用同一列表,则不会更新:u = t; del t[0]同时更改ut。但是u = t; t = t[1:]在保持u不变的情况下将新列表分配给t

  • 最后,del t[0]比更不透明的t = t[1:]更清楚其去除元素的意图。

只是一个del和slice的例子。

In [28]: u = t = [1, 2,3,4]
In [30]: id(u) == id(t)   # now the id is same,they point one obj
Out[30]: True

如果我们使用del运算符。

In [31]: del t[0]
In [32]: t
Out[32]: [2, 3, 4]
In [33]: u
Out[33]: [2, 3, 4]

但是如果我们使用slice操作符。

In [35]: t = t[1:]
In [36]: t
Out[36]: [2, 3, 4]
In [37]: id(t) == id(u)
Out[37]: False
In [39]: u
Out[39]: [1, 2, 3, 4]

我们发现t和u现在指向不同的obj,所以我们处理列表t,列表u不变。

考虑一个具有两种实现的函数:

def remove_first_a(t):
    t = t[1:]  

def remove_first_b(t):
    del t[0]

现在,请参阅正在使用的这些函数:

> l = [1, 2, 3]
> remove_first_a(l)
> l
[1, 2, 3]
> remove_first_b(l)
> l
[2, 3]

第一个实现只重新分配局部变量t,这对作为参数传递的对象没有影响。第二个实现实际上改变了这个对象。第一个函数在当前的形式下是相当无用的。你可以改变它:

def remove_first_a(t):
    return t[1:] 

> l = [1, 2, 3]
> x = remove_first_b(l)
> x
[2, 3]

你想要一个还是另一个,更多的取决于实际的用例。有时您希望原始的list仍然保持不变以供以后使用,有时您希望确保原始的list在所有仍有对其引用的地方都得到更改。

相关问题 更多 >