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

本文探讨了在Python中删除列表第一个元素的两种方法:`del`和切片赋值。使用`del t[0]`直接删除元素,而`t = t[1:]`创建了一个新的列表并重新赋值。文中指出,后者可能导致不必要的内存开销和对原始引用的影响,特别是在函数参数传递时。建议根据具体需求选择合适的方法,并强调清晰的代码可读性。
摘要由CSDN通过智能技术生成

我知道,如果我只想删除python中list t的第一个元素,我可以用以下方法来完成:

del t[0]

这是最简单的。然而:

t = t[1:]

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

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

为什么这样不好?你能举出一个例子,在这个例子中,这样的方法会显著地改变一个函数吗?事先谢谢。

如果您特别想做的是从列表中删除第一个元素,那么使用不这样做的方法是不好的做法。这并不意味着t = t[1:]总体上是不好的做法。

此外,还可以使用t[:] = t[1:]修改原始列表。

有很多情况下,要么是del t[0]要么是t = t[1:]是罚款的,还有很多情况下,del t[0]是错误的,t = t[1:]是适当的。

您可以使用t.pop(0),这将返回第一个元素的值并将其从列表中删除。

@darvark-op并没有要求其他方法从列表中删除项目,而是询问修改原始列表和创建新列表的用例。

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

创建一个新列表只需要做一些不必要的工作来创建新列表和取消分配旧列表。在这两个步骤之间,两次使用内存(因为原始列表和新列表同时处于活动状态,就在分配之前)。

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

最后,与不透明的t = t[1:]相比,del t[0]更清楚地说明了其去除元素的强度。

我认为t[:] = t[1:]可以用来改变现有的list对象,但它必须做大约两倍于del t[0]的工作,因为del操作只需要将所有后续的list项下移,而t[1:]必须将后续的项复制到新的list,然后将它们复制回原始的list对象。对吗?

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

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]

你想要一个还是另一个,更多地取决于实际的用例。有时,您希望原始的EDOCX1[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现在指向不同的对象,所以我们处理列表T,列表U不变。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值