允许Python list append方法返回新列表

Wil*_*ilk 58 python list append

我想做这样的事情:

myList = [10,20,30]
yourList = myList.append (40)
Run Code Online (Sandbox Code Playgroud)

不幸的是,list append不会返回修改后的列表.

那么,我如何允许append返回新列表?

Mar*_*ers 104

不要使用追加而是连接:

yourList = myList + [40]
Run Code Online (Sandbox Code Playgroud)

这会返回一个列表; myList不会受到影响.如果您还需要myList受影响,请使用.append(),然后yourList单独指定(副本)myList.

  • `append()` 返回 `None` 而不是同一个列表背后的基本原理是什么?它会违反哪个禅宗原则? (3认同)
  • @CiprianTomoiaga:见https://en.wikipedia.org/wiki/Command%E2%80%93query_separation; `list.append`是一个命令,而不是一个查询. (2认同)
  • @CiprianTomoiaga:另请参阅 [这封来自 Python BDFL 的电子邮件](https://mail.python.org/pipermail/python-dev/2003-October/038855.html)。 (2认同)
  • @Dieblitzen:是的,所以 OCaml 使用链表并将它们连接起来。Python 列表不是一成不变的,所以你不能用这些来做,而且,*其他一切都可以是可变的*。虽然 OCaml 列表包含不可变对象,但在 Python 中,不可变对象(如元组)的内容仍然可以是可变的,因此在连接时不能与其他容器共享内容。 (2认同)
  • @Dieblitzen:这就是为什么在 Python 中,要使连接操作有效,您必须创建一个浅拷贝,并支付 O(N) 时间。我应该更明确,对不起。 (2认同)

小智 15

在python 3中,您可以通过解压旧的并添加新元素来创建新列表:

a = [1,2,3]
b = [*a,4] # b = [1,2,3,4] 
Run Code Online (Sandbox Code Playgroud)

当你这样做时:

myList + [40]
Run Code Online (Sandbox Code Playgroud)

你实际上有3个列表.

  • 而且速度有点快 (2认同)

oly*_*lyk 10

不幸的是,这里的答案都没有完全解决所问的问题。这是一个简单的方法:

lst = [1, 2, 3]
lst.append(4) or lst  # the returned value here would be the OP's `yourList`
# [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

人们可能会问这样做的真正需要,例如当有人需要提高 RAM 使用率、进行微基准测试等时,这些通常是无用的。然而,有时有人真的是在“问所问的问题”(我不知道这里是否是这种情况),而现实比我们所知的更加多样化。所以这是一个(因为脱离上下文而设计的)用法......而不是这样做:

dic = {"a": [1], "b": [2], "c": [3]}

key, val = "d", 4  # <- example
if key in dic:
    dic[key].append(val)
else:
    dic[key] = [val]
dic
#  {'a': [1], 'b': [2], 'c': [3], 'd': [4]}

key, val = "b", 5  # <- example
if key in dic:
    dic[key].append(val)
else:
    dic[key] = [val]
dic
#  {'a': [1], 'b': [2, 5], 'c': [3], 'd': [4]}
Run Code Online (Sandbox Code Playgroud)

可以在任何需要表达式(而不是语句)的地方使用上面的 OR 表达式:

key, val = "d", 4  # <- example
dic[key] = dic[key].append(val) or dic[key] if key in dic else [val]
#  {'a': [1], 'b': [2], 'c': [3], 'd': [4]}

key, val = "b", 5  # <- example
dic[key] = dic[key].append(val) or dic[key] if key in dic else [val]
#  {'a': [1], 'b': [2, 5], 'c': [3], 'd': [4]}
Run Code Online (Sandbox Code Playgroud)

或者,等效地,当列表中没有虚假dic.get(key, <default value>)值时,可以尝试某种更好的方法。


ins*_*get 6

list.append是内置的,因此无法更改.但如果你愿意使用其他东西append,你可以尝试+:

In [106]: myList = [10,20,30]

In [107]: yourList = myList + [40]

In [108]: print myList
[10, 20, 30]

In [109]: print yourList
[10, 20, 30, 40]
Run Code Online (Sandbox Code Playgroud)

当然,这样做的缺点是创建了一个新的列表,这需要花费更多的时间 append

希望这可以帮助

  • 为了你自己的理智和你的同事,你永远不应该这样做:) (3认同)