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

时间:2013-05-20 00:52:32

标签: python 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中实现追加。

4 个答案:

答案 0 :(得分:45)

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"]

答案 1 :(得分:12)

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开始,现在更多explicitly documented

  

某些集合类是可变的。添加,减去的方法,   或重新安排他们的成员,并不返回特定项目,   永远不会返回集合实例本身,而是None

此设计决策背后的设计和历史常见问题gives the reasoning(关于列表):

  

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

     

在表现很重要的情况下,制作一份清单副本   只是为了排序它会很浪费。因此,list.sort()对此进行排序   列表到位。为了提醒你这个事实,它不会回来   排序清单。这样,你就不会被意外愚弄   在需要排序副本时覆盖列表但也需要保留   未分类的版本。

     

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

答案 2 :(得分:5)

建议的一个方面是避免使用关键词或函数作为变量名。在上面的代码中,您使用list作为变量:

list = [1, 2, 3]

我建议不要将list用作变量名,因为list实际上已经定义为内置类型。正如ChaseTheSun和squiguy指出的那样,它没有更多的东西

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

答案 3 :(得分:0)

它不返回任何内容。它会附加/添加到变量中,以查看您应该使用用于附加到print中的第一个变量

friends=["Rajendra V"]
friends.append("John")
print(friends)