删除列表中第一项的函数(Python)

时间:2015-12-06 01:34:32

标签: python

我正在尝试编写一个删除Python列表中第一项的函数。这就是我尝试过的。当我在上面调用函数时,为什么不删除_first_wrong?当我在main函数中执行它时,为什么列表切片方法会起作用?

def remove_first_wrong(lst):
    lst = lst[1:]

def remove_first_right(lst):
    lst.pop(0)

if __name__ == '__main__':
    l = [1, 2, 3, 4, 5]
    remove_first_wrong(l)
    print(l)

    l_2 = [1, 2, 3, 4, 5]
    remove_first_right(l_2)
    print(l_2)

    # Why does this work and remove_first_wrong doesn't?
    l_3 = [1, 2, 3, 4, 5]
    l_3 = l_3[1:]
    print(l_3)

3 个答案:

答案 0 :(得分:8)

切片列表会返回 new 列表对象,该列表对象是您在切片中指示的原始列表索引的副本。然后,您反弹lst(函数中的本地名称)以引用该新列表。在此过程中,旧列表永远不会被更改。

另一方面,

list.pop()对列表对象本身进行操作。你用来到列表的参考文献并不重要。

如果没有功能,你会看到同样的事情:

>>> a = [1, 2]
>>> b = a[:]  # slice with all the elements, produces a *copy*
>>> b
[1, 2]
>>> a.pop()  # remove an element from a won't change b
2
>>> b
[1, 2]
>>> a
[1]

使用[:]是制作列表浅表副本的两种方法之一,请参阅How to clone or copy a list?

您可能需要阅读或观看Ned Batchelder's Names and Values presestation,以进一步了解Python名称和对象的工作原理。

答案 1 :(得分:2)

在函数remove_first_wrong内,=符号会将名称lst重新分配给右侧的对象。这是一个全新的对象,通过切片操作lst[1:]创建。因此,分配给的对象lst是该函数的本地对象(实际上它将在返回时消失)。

这就是Martijn所说的“你然后反弹lst(函数中的本地名称)来引用这个新列表。”

相反,lst.pop(0)是对给定对象的调用 - 它对对象进行操作。

例如,这也适用:

def remove_first_right2(lst):
    x = lst  # x is assigned to the same object as lst
    x.pop(0) # pop the item from the object

答案 2 :(得分:1)

或者,您可以使用del关键字:

def remove_first_element(lst):
   del lst[0]
   return lst