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

时间:2008-10-22 22:38:49

标签: 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

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

谢谢!

7 个答案:

答案 0 :(得分: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()或其他修改参数的函数。 e.g。

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

答案 1 :(得分: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]

答案 2 :(得分:6)

执行相同操作的稍微更易读的方法是:

d = burninate(list(a))

此处,list()构造函数基于a创建新列表。

答案 3 :(得分:5)

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

答案 4 :(得分:2)

其他版本:

def burninate(b):
    c = []
    for i in range(1, 4):
        c.append(b[-i])
    return c
def burninate(b):
    c = b[-4:-1]
    c.reverse()
    return c

总有一天你会喜欢列表理解:

def burninate(b):
    return [b[-i] for i in range(1,4)]

答案 5 :(得分:1)

您可以使用copy.deepcopy()

答案 6 :(得分:0)

burninate = lambda x: x[:-4:-1]