为什么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]