Search code examples
pythonlistappendnested-lists

Python append() vs. += operator on lists, why do these give different results?


Why do these two operations give different results?

>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>> 

In the last case there's actually infinite recursion. c[-1] and c are the same. Why is it different with the + operation?


Solution

  • Editor's note: This answer confuses lists with arrays as well as += with +. Despite that, the concepts are similar enough to still be useful.


    To explain "why":

    The + operation adds the array elements to the original array. The array.append operation inserts the array (or any object) into the end of the original array, which results in a reference to self in that spot (hence the infinite recursion in your case with lists, though with arrays, you'd receive a type error).

    The difference here is that the + operation acts specific when you add an array (it's overloaded like others, see this chapter on sequences) by concatenating the element. The append-method however does literally what you ask: append the object on the right-hand side that you give it (the array or any other object), instead of taking its elements.

    An alternative

    Use extend() if you want to use a function that acts similar to the + operator (as others have shown here as well). It's not wise to do the opposite: to try to mimic append with the + operator for lists (see my earlier link on why). More on lists below:

    Lists

    [edit] Several commenters have suggested that the question is about lists and not about arrays. The question has changed, though I should've included this earlier.

    Most of the above about arrays also applies to lists:

    • The + operator concatenates two lists together. The operator will return a new list object.
    • List.append does not append one list with another, but appends a single object (which here is a list) at the end of your current list. Adding c to itself, therefore, leads to infinite recursion.
    • As with arrays, you can use List.extend to add extend a list with another list (or iterable). This will change your current list in situ, as opposed to +, which returns a new list.