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

Nim*_*iri 49 python list append nonetype

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

## RIGHT:
list.append(4)
print list  ## [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

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

xua*_*nji 53

append是一个变异(破坏性)操作(它修改了列表而不是返回一个新列表).做非破坏性等价物的惯用方法append

l = [1,2,3]
print l + [4] # [1,2,3,4]
print l # [1,2,3]
Run Code Online (Sandbox Code Playgroud)

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

m = l.append("a")
n = l.append("b")
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*ski 16

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])
Run Code Online (Sandbox Code Playgroud)

从Python 3.3开始,现在更明确地记录了这一点:

一些集合类是可变的.添加,删除或重新安排其成员的方法,并且不返回特定项,从不返回集合实例本身None.

设计和历史常见问题解答给出了此设计决策背后的原因(关于列表):

为什么不list.sort(返回排序列表?

在性能很重要的情况下,制作列表的副本只是为了对它进行排序将是浪费.因此,list.sort()将列表排序到位.为了提醒您这一事实,它不会返回排序列表.这样,当您需要排序副本时,您不会被意外地覆盖列表,但也需要保留未排序的版本.

在Python 2.4中添加了一个新的内置函数 - sorted().此函数从提供的iterable创建一个新列表,对其进行排序并返回它.


小智 5

建议之一是避免将关键字或函数用作变量名。在上面的代码中,您将list用作变量:

list = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

我建议不要使用list变量名,因为列表实际上已经定义为内置类型。正如ChaseTheSun和squiguy所指出的,那时没有什么更多的了。

l = [1, 2, 3]
l.append(4)
print l  ## [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

  • 小写的 L 作为变量名也不好,因为它看起来太像数字 1。我喜欢使用 `lst`。 (2认同)

归档时间:

查看次数:

48528 次

最近记录:

6 年,2 月 前