在保留原件的同时传递列表

Jam*_*mes 12 python list

所以我在教自己Python,我遇到了列表问题.我想传递我的函数列表并在保留原始列表的同时弹出项目.如何使python"instance"成为传递的列表,而不是将指针传递给原始列表?

例:

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

a = range(6)
d = burninate(a)
print a, d
Run Code Online (Sandbox Code Playgroud)

输出:[0,1,2] [
5,4,3 ] 期望输出:[0,1,2,3,4,5] [5,4,3]

谢谢!

Joh*_*uhy 14

正如其他答案所示,您可以为您的函数提供列表的副本.

作为替代方案,您的函数可以获取参数的副本:

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

基本上,你需要在脑海中(以及在你的文档中)清楚你的功能是否会改变它的论点.在我看来,返回计算值的函数不应该更改它们的参数,并且更改其参数的函数不应返回任何内容.有关示例,请参阅python的[] .sort(),[] .extend(),{}.update()等.显然有例外(如.pop()).

此外,根据您的具体情况,您可以重写该函数以避免使用pop()或其他修改参数的函数.例如

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


mha*_*wke 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]
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 6

一个稍微更易读的方法来做同样的事情是:

d = burninate(list(a))
Run Code Online (Sandbox Code Playgroud)

在这里,list()构造函数基于创建一个新列表a.


小智 5

更通用的解决方案是import copy,并copy.copy()在参数上使用.