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?
Editor's note: This answer confuses lists with arrays as well as +=
with +
. Despite that, the concepts are similar enough to still be useful.
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.
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:
[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 array
s also applies to lists:
+
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.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.