Python函数返回新列表而不修改输入列表

时间:2012-02-24 22:23:30

标签: python list copy

民间,

我想有一个函数将列表作为输入,返回另一个列表,它是输入的修改,但我不想更改原始列表。以下代码是否是我能做的最好的代码?

另外,为了避免错误,如果我将元组(a)传递给函数modify(a)函数并将元组转换为modify(a)函数内的列表会更好吗?

非常感谢您的回复。

def modify(a):
    b = a[:]
    # some changes on b here
    ......
    return b      

6 个答案:

答案 0 :(得分:5)

如果您的列表包含任何子列表,词典或其他“可变”元素,并且您的算法可能会对它们进行更改,那么oldlist[::-1]给您的浅层列表副本是不够的。使用模块deepcopy中的copy制作完全独立的输入副本。

from copy import deepcopy
newlist = deepcopy(oldlist)

答案 1 :(得分:1)

您的代码看起来非常合理,您可以将b = a[:]替换为b = list(a),以使您的代码更加通用。也没有理由使用tuple(a)。如果你想走那条路,可以让modify就地工作,并像b = modify(a[:])一样调用它。

答案 2 :(得分:0)

我认为没有理由不满意:

  • 您正在复制列表,因此无需担心无意中将其删除
  • 元组解包是交换两个变量的最有效方式,如

保持这种方式,imo。

答案 3 :(得分:0)

这只适用于len 2的列表。

如果发送元组并不重要,但这完全取决于你。

答案 4 :(得分:0)

你可以这样做:

>>> def swap(l):
...   return l[::-1]
... 
>>> my_list = [1,2,3]
>>> swap(my_list)
[3, 2, 1]
>>> my_list
[1, 2, 3]

无论是列表还是元组都无关紧要,无论如何都要交换:)

答案 5 :(得分:0)

整理您的代码,而不是使用a = b[::-1]

def swapped(b):
    assert len(b) == 2
    return [b[1], b[0]]

选择功能名称:swappedswapsortedsort ...它表示arg未被变异。

这很容易概括:

def gather(sequence, indices):
    return [sequence[i] for i in indices]