12

所以我正在自学 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]

谢谢!

4

7 回答 7

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
于 2008-10-22T23:00:37.723 回答
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]
于 2008-10-22T22:42:32.643 回答
6

做同样事情的一种更易读的方法是:

d = burninate(list(a))

在这里,list()构造函数基于a.

于 2008-10-22T22:45:13.807 回答
5

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

于 2008-10-22T23:00:00.890 回答
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)]
于 2008-10-22T22:58:06.107 回答
1

您可以使用 copy.deepcopy()

于 2009-02-07T10:52:00.650 回答
0
burninate = lambda x: x[:-4:-1]
于 2008-10-22T23:09:10.093 回答