list – Why does append() always return None in Python?-ThrowExceptions

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

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.

How to solve:

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]
print l + [4] # [1,2,3,4]
print 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"]


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


>>> a_list = [3, 2, 1]
>>> print a_list.sort()
>>> a_list
[1, 2, 3]

>>> a_dict = {}
>>> print a_dict.__setitem__('a', 1)
>>> a_dict
{'a': 1}

>>> a_set = set()
>>> print a_set.add(1)
>>> a_set

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.


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

l = [1, 2, 3]
print l  ## [1, 2, 3, 4]


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

Leave a Reply

Your email address will not be published. Required fields are marked *