2012-10-15 41 views

回答

61

不要追加,但连接而不是:

yourList = myList + [40] 

这将返回一个列表; myList不会受到影响。如果您需要myList受影响以及无论如何都使用.append(),然后分别从myList(的副本)分配yourList

+0

会是怎样被身后'的append()''返回的None'理,而不是同一个列表?它会违反哪个禅宗原则? –

+1

@CiprianTomoiaga:见https://en.wikipedia.org/wiki/Command%E2%80%93query_separation; 'list.append'是一个命令,而不是查询。 –

+0

@CiprianTomoiaga:另见[这封电子邮件来自Python BDFL](https://mail.python.org/pipermail/python-dev/2003-October/038855.html)。 –

5

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

希望这有助于

+0

但内置的可以被子类,然后怎么都行:) –

+0

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

+2

为了您自己的理智和同事的理智,您永远不应该这样做:) –

0

你只需要做 myList.append(40)

将其追加到原来的列表,而不是返回一个新的列表。

1

你也可以继承内置列表类型,并重新定义了“追加”的方法。或者甚至更好,创建一个新的,它将做你想做的事情。以下是重新定义的“附加”方法的代码。

#!/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() 

希望有所帮助。

0

尝试使用itertools.chain(myList, [40])。这将按顺序返回一个生成器,而不是分配一个新列表。从本质上讲,返回所有来自第一迭代的元素,直到它耗尽,然后前进到下一个迭代,直到所有的iterables的耗尽。

0

只是对Storstamp的答案扩大

你只需要做 myList.append(40)

将其追加到最初的名单,现在你可以返回一个包含原始列表中的变量。

如果您正在使用非常大名单的工作,这是要走的路。

2

在Python 3中,你可以通过拆包旧的和添加新的元素创建新的列表:

a = [1,2,3] 
b = [*a,4] // b = [1,2,3,4] 

当你这样做:

myList + [40] 

你确实有3名名单。