如何允许列表append()方法返回新列表


82

我想做这样的事情:

myList = [10,20,30]
yourList = myList.append (40)

不幸的是,列表追加未返回修改后的列表。

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

Answers:


139

不要使用追加而是串联:

yourList = myList + [40]

这将返回一个列表。myList不会受到影响。如果你需要有myList受影响的还有既可以使用.append(),无论如何,然后分配yourList分开(复印件)myList


2
append()返回None而不是返回相同列表的理由是什么?它会违反哪个禅宗原则?
CiprianTomoiagă17年

3
@CiprianTomoiaga:参见en.wikipedia.org/wiki/Command%E2%80%93query_separation ; list.append是命令,而不是查询。
马丁·彼得斯

2
@CiprianTomoiaga:也请参阅来自Python BDFL的电子邮件
马丁·彼得斯

2
@Dieblitzen:是的,因此OCaml使用链接列表并将其连接。Python列表不是一成不变的,因此您不能使用它们来做到这一点,此外,其他所有东西都是可变的。尽管OCaml列表包含不可变对象,但在Python中,不可变对象(例如元组)的内容仍然是可变的,因此在连接时不能与其他容器共享内容。
马丁·彼得斯

2
@Dieblitzen:这就是为什么在Python中,要使串联操作有效,您必须创建一个浅表副本并支付O(N)时间。对不起,我应该更加明确了。
马丁·彼得斯


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]

当然,这样做的缺点是创建新列表所花费的时间比 append

希望这可以帮助


但是内置的可以被子类化,然后一切都可以进行:)
Marcin Wyszynski 2012年

@MarcinWyszynski:是的,但是只能在子类中进行修改。内置对象/类的内置方法极少被覆盖(如果有的话)
inspectorG4dget

3
为了您自己和您同事的理智,您永远不要这样做:)
Marcin Wyszynski 2012年

2

您可以将内置列表类型作为子类,然后重新定义“ append”方法。甚至更好的做法是,创建一个新的文件,该文件将执行您想要的操作。下面是重新定义的“ append”方法的代码。

#!/usr/bin/env python

class MyList(list):

  def append(self, element):
    return MyList(self + [element])


def main():
  l = MyList()
  l1 = l.append(1)
  l2 = l1.append(2)
  l3 = l2.append(3)
  print "Original list: %s, type %s" % (l, l.__class__.__name__)
  print "List 1: %s, type %s" % (l1, l1.__class__.__name__)
  print "List 2: %s, type %s" % (l2, l2.__class__.__name__)
  print "List 3: %s, type %s" % (l3, l3.__class__.__name__)


if __name__ == '__main__':
  main()

希望能有所帮助。


2

尝试使用itertools.chain(myList, [40])。这将按顺序返回一个生成器,而不是分配一个新列表。本质上,这将从第一个可迭代对象返回所有元素,直到用尽为止,然后继续进行到下一个可迭代对象,直到所有可迭代对象都耗尽为止。


1

只是为了扩展Storstamp的答案

您只需要做myList.append(40)

它将添加到原始列表,现在您可以返回包含原始列表的变量。

如果要处理非常大的列表,这是一种方法。


-4

您只需要做myList.append(40)

它将添加到原始列表,而不返回新列表。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.