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

8 python python-3.x

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

del t[0]
Run Code Online (Sandbox Code Playgroud)

这和它一样简单明了.但是:

t = t[1:]
Run Code Online (Sandbox Code Playgroud)

也有效.在我从中学到的教科书中说,使用后一种方法通常被认为是不好的做法,因为它不会删除列表的头部本身但是

"切片运算符创建一个新列表,赋值使得它引用它,但这些都不会对作为参数传递的列表产生任何影响."

为什么这么糟糕?你能说出一个这样的方法会显着改变一个函数的例子吗?提前致谢.

Ray*_*ger 5

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

  • 创建新列表只会使不必要的工作生成新列表并取消分配旧列表.在这两个步骤之间,使用了两倍的内存(因为原始列表和新列表在分配之前同时存在).

  • 如果其他内容引用相同的列表,则不会更新:u = t; del t[0]更改ut.但u = t; t = t[1:]分配新的列表牛逼而留下ü不变.

  • 最后,del t[0]更清楚的是它的意图是去除元素而不是更不透明t = t[1:].


sch*_*ggl 2

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

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

def remove_first_b(t):
    del t[0]
Run Code Online (Sandbox Code Playgroud)

现在,查看正在使用的这些函数:

> l = [1, 2, 3]
> remove_first_a(l)
> l
[1, 2, 3]
> remove_first_b(l)
> l
[2, 3]
Run Code Online (Sandbox Code Playgroud)

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

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

> l = [1, 2, 3]
> x = remove_first_b(l)
> x
[2, 3]
Run Code Online (Sandbox Code Playgroud)

无论您想要其中之一,更多地取决于实际用例。有时您希望原件list仍然保持不变以供以后使用,有时您希望确保原件在仍然引用它的所有地方都得到更改。