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

Function which removes the first item in a list (Python)

我正在尝试编写一个函数,它删除了python列表中的第一项。这是我试过的。当我调用函数时,为什么不先删除错误的更改l?当我在主函数中执行时,为什么列表切片方法有效?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)


对列表进行切片将返回一个新的列表对象,该对象是切片中指示的原始列表索引的副本。然后反弹lst(函数中的本地名称),以引用新列表。在这个过程中,旧的列表永远不会改变。

另一方面,list.pop()对列表对象本身进行操作。无论你用什么样的推荐信去名单上。

你会看到同样的东西没有功能:

1
2
3
4
5
6
7
8
9
10
>>> 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]

使用[:]是制作列表的简单副本的两种方法之一,请参见如何克隆或复制列表?

您可能需要阅读或观看ned batchelder的名称和值预设,以进一步帮助理解Python名称和对象的工作方式。


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

这就是martijn的意思,"然后反弹EDOCX1(函数中的本地名称),以引用新列表。"

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

例如,这也可以正常工作:

1
2
3
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


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

1
2
3
def remove_first_element(lst):
   del lst[0]
   return lst