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

3

大家好,

我希望有一个函数以列表为输入,返回另一个修改后的列表,但又不想改变原始列表。下面的代码是否是最佳选择?

此外,为了避免错误,如果我将元组(a)传递到modify(a)函数中,并在modify(a)函数内将元组转换为列表,那么是否更好?

非常感谢您的回复。

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

你是否经常使用 a = b[::-1] 来翻转两个元素列表?我没有看到任何指示你想要交换哪些索引的东西。 - g.d.d.c
你能详细说明一下你需要什么吗?列表的长度会有多长,你想使用什么样的交换模式,你是否希望用户能够影响交换?提供这种信息将极大地帮助我们帮助你。 - Paul Hiemstra
“some changes on b here” 是无用的信息。如果您想要一个具体的答案,请提出一个具体的问题。否则,您可以自己填写空白。 - John Machin
6个回答

5
如果您的列表包含任何子列表、字典或其他"可变"元素,并且您的算法可能对它们进行更改,则 oldlist[::-1] 给出的浅层列表副本是不够的。请使用模块 copy 中的 deepcopy 来创建一个完全独立的输入副本。
from copy import deepcopy
newlist = deepcopy(oldlist)

2

我认为你的代码看起来非常合理,你可以用b = list(a)替换b = a[:],使你的代码更加通用。另外,使用tuple(a)没有任何意义。如果你想这么做,你可以让modify原地修改并像这样调用它:b = modify(a[:])


0

你可以做:

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

无论是列表还是元组,它们都会被交换 :)


0

在不使用 a = b[::-1] 这样的代码的情况下整理你的代码:

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

函数名称的选择: swapped 相当于 swap,就像 sorted 相当于 sort ... 这表明参数没有被改变。

这可以很容易地推广:

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

0

我看不出来为什么这不是令人满意的:

  • 你在复制列表,因此不用担心无意中将其弄乱
  • 元组解包是像那样交换两个变量最有效的方法

按照我的意见保持它。


0

这只适用于长度为2的列表。

如果您发送元组也无关紧要,完全取决于您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接