为什么append在这段代码中没有返回?

list = [1, 2, 3] print list.append(4) ## NO, does not work, append() returns None ## Correct pattern: list.append(4) print list ## [1, 2, 3, 4] 

我正在学习Python,我不确定这个问题是否是特定于该语言的,以及如何在Python中实现append。

append是一个破坏性的操作(它修改了列表,而不是返回一个新的列表)。 做非破坏性等同于append的惯用方法是

 l = [1,2,3] print l + [4] # [1,2,3,4] print l # [1,2,3] 

回答你的问题,我的猜测是,如果append返回新修改的列表,用户可能会认为这是非破坏性的,即他们可能会写代码

 m = l.append("a") n = l.append("b") 

并期望n[1,2,3,"b"]

Python中的一个约定是,变异序列的方法返回None

考虑:

 >>> a_list = [3, 2, 1] >>> print a_list.sort() None >>> a_list [1, 2, 3] >>> a_dict = {} >>> print a_dict.__setitem__('a', 1) None >>> a_dict {'a': 1} >>> a_set = set() >>> print a_set.add(1) None >>> a_set set([1]) 

从Python 3.3开始,现在已经有了更明确的logging :

一些集合类是可变的。 那些在原地添加,减去或重新排列其成员的方法,不返回特定的项目,永远不会返回集合实例本身,而是返回None

“devise与历史常见问题解答” 给出了这个devise决定背后的推理 (关于列表):

为什么不list.sort( )返回sorting列表?

在performance很重要的情况下,把这份清单复制一下就可能是浪费的。 因此, list.sort()对列表进行sorting。 为了提醒你这个事实,它不会返回sorting列表。 这样,当你需要一个分类的副本时,你不会被意外覆盖列表,但也需要保持未sorting的版本。

在Python 2.4中,增加了一个新的内置函数 – sorted() 。 这个函数从提供的迭代器中创build一个新的列表,对它进行sorting并返回。

build议一句话就是避免使用关键词或函数作为variables名。 在你的代码中,你使用list作为variables:

 list = [1, 2, 3] 

我build议不要使用list作为variables名,因为list实际上已经被定义为内buildtypes。 正如追逐太阳和squ pointed指出的那样,那就不多了

 l = [1, 2, 3] l.append(4) print l ## [1, 2, 3, 4]