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]

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

评论

首先,您将打印追加操作的结果。如果append()成功完成,则返回“ None”,例如遇到的问题:无

如果有效,则append将返回None。没有比这更多的了。

嗯,如果原始代码中的注释提到了append是void函数,那么(至少对我来说)会更容易理解。这很有意义,谢谢。

大多数标准库使用的约定是,如果应该使用某种方法来改变对象的位置,则该方法应返回None。在某些例外情况下,遵循此规则会使代码更难使用(list.pop是一个示例)。但是这些绝对是例外,而不是常规。

这个问题与您提出的问题非常相似。也可以在那里查看答案。

#1 楼

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

#2 楼

按照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开始,现在更多明确记录的内容:


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


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


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

/>在性能很重要的情况下,仅复制列表进行复制会很浪费。因此,list.sort()
列表进行适当排序。为了提醒您这个事实,它不会返回已排序的列表。这样,当您需要排序的副本但又需要保留未排序的版本时,您不会被误认为
覆盖列表。

在Python 2.4中已添加新的内置函数sorted()
此函数根据提供的可迭代对象创建一个新列表,对其进行排序
并返回它。


#3 楼

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

list = [1, 2, 3]


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

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


#4 楼

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

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