List append() in for loop raises exception: 'NoneType' object has no attribute 'append'

Question:

In Python, trying to do the most basic append function to a list with a loop:
Not sure what I am missing here:

a = []
for i in range(5):    
    a = a.append(i)

returns:

‘NoneType’ object has no attribute ‘append’

Asked By: jim jarnac

||

Answers:

The list.append function does not return any value(but None), it just adds the value to the list you are using to call that method.

In the first loop round you will assign None (because the no-return of append) to a, then in the second round it will try to call a.append, as a is None it will raise the Exception you are seeing

You just need to change it to:

a=[]
for i in range(5):    
    a.append(i)
print(a)
# [0, 1, 2, 3, 4]

list.append is what is called a mutating or destructive method, i.e. it will destroy or mutate the previous object into a new one(or a new state).

If you would like to create a new list based in one list without destroying or mutating it you can do something like this:

a=['a', 'b', 'c']
result = a + ['d']

print result
# ['a', 'b', 'c', 'd']

print a
# ['a', 'b', 'c']

As a corollary only, you can mimic the append method by doing the following:

a=['a', 'b', 'c']
a = a + ['d']

print a
# ['a', 'b', 'c', 'd']
Answered By: Rafael Aguilar

You don’t need the assignment, list.append(x) will always append x to a and therefore there’s no need te redefine a.

a = []
for i in range(5):    
    a.append(i)
print(a)

is all you need. This works because lists are mutable.

Also see the docs on data structures.

Answered By: linusg

No need to re-assign.

a=[]
for i in range(5):    
    a.append(i)
a
Answered By: Muntaser Ahmed
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.