【问题标题】:Deleting first element of a list in Python在 Python 中删除列表的第一个元素
【发布时间】:2017-08-18 22:35:23
【问题描述】:

我知道,如果我想在 Python 中删除 t 列表的第一个元素,我可以这样做:

del t[0]

这是最简单的。但是:

t = t[1:]

也可以。在我从中学习的教科书中说,使用后一种方法通常被认为是不好的做法,因为它不会删除列表的头部本身而是

"切片操作符创建了一个新列表,并且赋值使 t 引用它,但这些都没有 对作为参数传递的列表有任何影响。”

为什么这样不好?你能举一个例子,这种方法会显着改变一个功能吗?提前致谢。

【问题讨论】:

  • 如果你特别想做的是从列表中删除第一个元素,使用不这样做的方法是不好的做法。这并不意味着t = t[1:] 通常是不好的做法。
  • 另外,您可以使用t[:] = t[1:]修改原始列表。
  • 在很多情况下del t[0]t = t[1:] 都可以,很多情况下del t[0] 是错误的而t = t[1:] 是合适的。
  • 您可以使用t.pop(0),这将返回第一个元素的值并将其从列表中删除。
  • @darvark - OP 并没有要求从列表中删除项目的其他方法,他们询问的是修改原始列表与创建新列表的用例。

标签: python python-3.x


【解决方案1】:

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

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

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

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

【讨论】:

  • 我认为t[:] = t[1:] 可以 用于改变现有的列表对象,但它的工作量大约是del t[0] 的两倍,因为del操作只需将所有后续列表项向下移动,而t[1:] 必须将后续项复制到新列表,然后将它们复制回原始列表对象。对吗?
【解决方案2】:

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

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]

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

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

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

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

【讨论】:

    【解决方案3】:

    只是 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]
    

    但如果我们使用切片运算符。

    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是不变的。

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      • 1970-01-01
      • 2022-11-13
      • 2019-04-16
      相关资源
      最近更新 更多