传递列表同时保留原始列表

12 投票
7 回答
454 浏览
提问于 2025-04-11 09:31

我正在自学Python,遇到了一个关于列表的问题。我想把一个列表传给我的函数,然后从中删除一些元素,但又想保留原来的列表。怎么才能让Python“实例化”传入的列表,而不是传递原列表的引用呢?

举个例子:

def burninate(b):
    c = []
    for i in range(3):
        c.append(b.pop())
    return c

a = range(6)
d = burninate(a)
print a, d

输出结果是:[0, 1, 2] [5, 4, 3]
我想要的输出结果是:[0, 1, 2, 3, 4, 5] [5, 4, 3]

谢谢!

7 个回答

6

有一种稍微更容易理解的方式来做同样的事情:

d = burninate(list(a))

在这里,list()这个构造函数是用来根据a创建一个新的列表的。

10

你可以这样调用 burninate(),用列表的一个副本:

d = burninate(a[:])

或者,你也可以这样:

d = burninate(list(a))

另外一种方法是在你的函数里面直接复制这个列表:

def burninate(b):
    c=[]
    b=b[:]
    for i in range(3):
        c.append(b.pop())
    return c

>>> a = range(6)
>>> b = burninate(a)
>>> print a, b
>>> [0, 1, 2, 3, 4, 5] [5, 4, 3]
14

正如其他回答所提到的,你可以给你的函数传一个列表的副本。

另外,你的函数也可以直接接收参数的副本:

def burninate(b):
    c = []
    b = list(b)
    for i in range(3):
        c.append(b.pop())
    return c

基本上,你需要清楚你的函数是否会改变传入的参数,这一点在你的文档中也要说明。我的看法是,返回计算结果的函数不应该改变它的参数,而那些会改变参数的函数则不应该返回任何东西。可以看看Python中的一些例子,比如[].sort()、[].extend()、{}.update()等。显然,也有一些例外情况,比如.pop()。

另外,根据你的具体情况,你可以重写函数,避免使用.pop()或其他会修改参数的函数。例如:

def burninante(b):
    return b[:-4:-1]   # return the last three elements in reverse order

撰写回答