Why does append() always return None in Python?

PythonListAppendNonetype

Python Problem Overview


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]

I'm learning Python and I'm not sure if this problem is specific to the language and how append is implemented in Python.

Python Solutions


Solution 1 - Python

append is a mutating (destructive) operation (it modifies the list in place instead of of returning a new list). The idiomatic way to do the non-destructive equivalent of append would be

>>> l = [1,2,3]
>>> l + [4]
[1,2,3,4]
>>> l
[1,2,3]

to answer your question, my guess is that if append returned the newly modified list, users might think that it was non-destructive, ie they might write code like

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

and expect n to be [1,2,3,"b"]

Solution 2 - Python

It is a convention in Python that methods that mutate sequences return None.

Consider:

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

Starting in Python 3.3, this is now more explicitly documented:

> Some collection classes are mutable. The methods that add, subtract, > or rearrange their members in place, and don’t return a specific item, > never return the collection instance itself but None.

The Design and History FAQ gives the reasoning behind this design decision (with respect to lists):

> Why doesn’t list.sort() return the sorted list? > > In situations where performance matters, making a copy of the list > just to sort it would be wasteful. Therefore, list.sort() sorts the > list in place. In order to remind you of that fact, it does not return > the sorted list. This way, you won’t be fooled into accidentally > overwriting a list when you need a sorted copy but also need to keep > the unsorted version around. > > In Python 2.4 a new built-in function – sorted() – has been added. > This function creates a new list from a provided iterable, sorts it > and returns it.

Solution 3 - Python

One word of advice would be to avoid using key words or functions as variable names. In your code above, you use list as a variable:

list = [1, 2, 3]

I would advise against using list as a variable name as list is actually already defined as a builtin type. As ChaseTheSun and squiguy pointed out, there isn't much more to it then

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

Solution 4 - Python

list.append() is an in-place operation, meaning that it modifies the state of the list, instead of returning a new list object.

All functions in Python return None unless they explicitly return something else. The method a.append() modifies a itself, which means that there's nothing to return.

Another way you can see this behavior is in the difference between sorted(some_list) and some_list.sort().

If you don't want to append "x" to a, then you'll need to use the second snippet, or you can simply concatenate:

>>> a = [1, 2, 3, 4]
>>> b = a[1:] + ["x"]
>>> b
[2, 3, 4, 'x']

To further clarify:

>>> a = [1, 2, 3, 4]
>>> b = a[1:].append("x")
>>> a
[1, 2, 3, 4]
>>> a[1:]
[2, 3, 4]
>>> type(b)
<class 'NoneType'>

Notice that b is None, since the list.append() method returns None. Notice also that a wasn't actually modified. This is because you were appending to a slice of a, but not actually saving that slice anywhere. Notice what happens if you do a.append("x"):

>>> b = a.append("x")
>>> a
[1, 2, 3, 4, 'x']
>>> type(b)
<class 'NoneType'>

b is still None, but now a got modified.

Solution 5 - Python

It does not return anything. it appends/add to the variable, to see you should use the first variable which used to append in print

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionstarcodexView Question on Stackoverflow
Solution 1 - PythonxuanjiView Answer on Stackoverflow
Solution 2 - PythonSteven RumbalskiView Answer on Stackoverflow
Solution 3 - PythonjbizView Answer on Stackoverflow
Solution 4 - PythonddejohnView Answer on Stackoverflow
Solution 5 - PythonRajendra sView Answer on Stackoverflow