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

Python 如何允许list append()方法返回新列表,python,list,append,Python,List,Append,我想这样做: myList = [10, 20, 30] yourList = myList.append(40) 遗憾的是,list append不会返回修改后的列表 那么,如何允许append返回新列表?不要使用append,而是使用连接: yourList = myList + [40] 这将返回一个新列表我的列表将不受影响。如果您需要同时影响myList,请使用.append(),然后将列表与myList的(副本)分开分配。append是内置的,因此无法更改。但是,如果您愿意使用附加

我想这样做:

myList = [10, 20, 30]
yourList = myList.append(40)
遗憾的是,list append不会返回修改后的列表


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

不要使用append,而是使用连接:

yourList = myList + [40]

这将返回一个新列表<代码>我的列表将不受影响。如果您需要同时影响
myList
,请使用
.append()
,然后将
列表
myList的(副本)分开分配。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

希望这对你有所帮助 myList.append(40)


它会将其附加到原始列表中,而不会返回新列表。

您可以对内置列表类型进行子类化,并重新定义“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()

希望有帮助。

尝试使用
itertools.chain(myList,[40])
。这将以序列形式返回生成器,而不是分配新列表。从本质上讲,它返回第一个iterable中的所有元素,直到它用完为止,然后继续到下一个iterable,直到所有iterable用完为止。

仅在Storstamp的答案上展开

你只需要做 myList.append(40)

它会将其附加到原始列表中,现在您可以返回包含原始列表的变量


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

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

a = [1,2,3]
b = [*a,4] # b = [1,2,3,4] 
当您这样做时:

myList + [40]

您实际上有3个列表。

不幸的是,这里没有一个答案能够准确地解决问题。以下是一个简单的方法:

lst = [1, 2, 3]
lst.append(4) or lst  # the returned value here would be the OP's `yourList`
# [1, 2, 3, 4]
有人可能会问这样做的真正需要,比如当有人需要提高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]}
dic={“a”:[1],“b”:[2],“c”:[3]}

key,val=“d”,4#但是内置的可以被子类化,然后什么都可以:)@MarcinWyszynski:是的,但是它们只能在子类内修改。内置对象/类的内置方法很少会被覆盖,如果为了你自己和同事的理智,你永远不应该这样做:)除了相同的列表,返回
None
append()
背后的原理是什么?它会违反哪一个禅宗原则?@Cipriantomoaga:看<代码>列表。追加是一个命令,而不是查询。@CiprianTomoiaga:另请参见。@Dieblitzen:对,所以OCaml使用链接列表并连接它们。Python列表不是不可变的,所以不能使用它们,而且,其他所有内容都是可变的。虽然OCaml列表包含不可变对象,但在Python中,元组等不可变对象的内容仍然是可变的,因此在连接时不能与其他容器共享内容。@Dieblitzen:这就是为什么在Python中,为了使连接操作有效,必须创建一个浅层副本,并支付O(N)时间。对不起,我应该说得更清楚一点,而且要快一点
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]}